AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenauswertung mit SQL-Befehl?
Thema durchsuchen
Ansicht
Themen-Optionen

Datenauswertung mit SQL-Befehl?

Ein Thema von d6lpz · begonnen am 16. Apr 2008 · letzter Beitrag vom 19. Apr 2008
Antwort Antwort
Seite 2 von 3     12 3      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Datenauswertung mit SQL-Befehl?

  Alt 17. Apr 2008, 16:35
Zitat von d6lpz:
2. Die SQL zählt mir doch nur die Anzahl der "W" pro Mitarbeiter in dem angegebenen Zeitraum
Die Anzahl jedes Content.

Mach doch mal bitte 2 Tabellen:
1. mit ein paar Einträgen und
2. das was rauskommen soll

So raten wir doch eh nur herum. Wie gesagt, mit SQL geht alles, nur mit Access vielleicht nicht.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
d6lpz

Registriert seit: 26. Mär 2008
73 Beiträge
 
Delphi 6 Professional
 
#12

Re: Datenauswertung mit SQL-Befehl?

  Alt 17. Apr 2008, 17:04
Im Anhang ist eine mdb mit drei Tabellen.
Ich hoffe ich habe mich nicht vertippt, aber es müßte sichtbar werden um was mir geht.

Danke für alle Tips und Anregungen.
Dirk
Angehängte Dateien
Dateityp: rar test_167.rar (8,4 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Datenauswertung mit SQL-Befehl?

  Alt 17. Apr 2008, 19:38
Zitat von omata:
Kannst du nicht mal ein konkretes Beispiel liefern, was du wie hast und was du eigentlich genau haben möchtest?
Zitat von alzaimar:
@omata. Ich denke, er hat sich einigermaßen klar ausgedrückt, jedenfalls denke ich, er möchte zählen, wie oft ein Name hintereinander vorkommt. Ach neee, er meint ne einfache Gruppierung mit Summen!
Zitat von alzaimar:
Mach doch mal bitte 2 Tabellen:
1. mit ein paar Einträgen und
2. das was rauskommen soll

So raten wir doch eh nur herum. Wie gesagt, mit SQL geht alles, nur mit Access vielleicht nicht.
Da fehlen mir echt die Worte...


So und nun zum eigentlichen Problem...
SQL-Code:
SELECT a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content = 'W')
WHERE MONTH(a.f_date) = 1
  AND a.f_content = 'W'
  AND b.nameID IS NULL
GROUP BY a.f_name
oder auch...

SQL-Code:
SELECT MONTH(a.f_date) monat, YEAR(a.f_date) jahr, a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content = 'W')
WHERE a.f_content = 'W'
  AND b.nameID IS NULL
GROUP BY a.f_name, MONTH(a.f_date), YEAR(a.f_date)
  Mit Zitat antworten Zitat
d6lpz

Registriert seit: 26. Mär 2008
73 Beiträge
 
Delphi 6 Professional
 
#14

Re: Datenauswertung mit SQL-Befehl?

  Alt 18. Apr 2008, 14:31
Hallo - du bist DER Held!

Ich bin einigermaßen biff was man mit SQL alles machen kann. Ich wollte das doch tatsächlich über Schleifen rausfummeln. Mal abgesehen von der besch... Performance der Schleifenlösung, ist diese SQL Lösung doch viel eleganter!!

Zitat von omata:

SQL-Code:
SELECT a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content = 'W')
WHERE MONTH(a.f_date) = 1
  AND a.f_content = 'W'
  AND b.nameID IS NULL
GROUP BY a.f_name
oder auch...

SQL-Code:
SELECT MONTH(a.f_date) monat, YEAR(a.f_date) jahr, a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content = 'W')
WHERE a.f_content = 'W'
  AND b.nameID IS NULL
GROUP BY a.f_name, MONTH(a.f_date), YEAR(a.f_date)
Das funktioniert tatsächlich (Variante 2 habe ich bis jetzt getestet).
Ich muß jetzt nur noch richtig verstehen, was da eigentlich richtig passiert

Ich bin momentan dabei diese Variante zu erweitern. Um es nicht noch weiter zu verkomplizieren, hatte ich bis jetzt noch eine weitere Bedingung für das Zyklenzählen "verschwiegen".
Eine weitere Bedingung für das Erkennen eines cycles ist dieses "C" in der Tabelle. Wenn nämlich zwischen zwei "W" ein oder auch mehrere hintereinanderfolgende "F" stehen, dann soll der Zyklus als zusammengehörig erkannt werden.
Also z.b.
"W"
"W"
"C"
"W"
"W"
"F"
"F"
"F"
"W"
"W"
wären dann nicht drei Zyklen sondern nur zwei.
Das "C" kann auch ein "A" oder "S" oder "K" sein. Sowie aber zwischen zwei "W" ein oder mehrere "F" stehen, zählt es als ein Zyklus.
Ich versuche das jetzt irgendwie noch zu integrieren. Wenn du noch Lust hast, wäre ich über einen weiteren Tip natürlich auch nicht böse

Dirk
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Datenauswertung mit SQL-Befehl?

  Alt 18. Apr 2008, 14:34
Manchmal sind die Tabellen- bzw. Datenkonstrukte nicht geeignet, um effektive Auswertungen fahren zu können
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Datenauswertung mit SQL-Befehl?

  Alt 18. Apr 2008, 14:42
Zitat von alzaimar:
Grundsätzlich geht fast Alles in SQL.
Vielleicht so...

SQL-Code:
SELECT MONTH(a.f_date) monat, YEAR(a.f_date) jahr, a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content IN ('W', 'F'))
WHERE a.f_content IN ('W', 'F')
  AND b.nameID IS NULL
GROUP BY a.f_name, MONTH(a.f_date), YEAR(a.f_date)
  Mit Zitat antworten Zitat
d6lpz

Registriert seit: 26. Mär 2008
73 Beiträge
 
Delphi 6 Professional
 
#17

Re: Datenauswertung mit SQL-Befehl?

  Alt 18. Apr 2008, 17:19
Zitat von "omata:
SQL-Code:
SELECT MONTH(a.f_date) monat, YEAR(a.f_date) jahr, a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content IN ('W', 'F'))
WHERE a.f_content IN ('W', 'F')
  AND b.nameID IS NULL
GROUP BY a.f_name, MONTH(a.f_date), YEAR(a.f_date)
Ich brauche noch mal Unterstützung. Ich habe jetzt schon verschiedenes probiert aber ich erhalte nicht das gewünschte Ergebnis.

Offensichtlich verstehe ich auch die SQL Syntax nicht richtig.
Wozu ist das 'b.nameID IS NULL' da. Wenn ich es raus nehme erhalte ich die Anzahl der "W" pro name.

Edit-> Namen werden angezeigt - ich hatte ein Fehler in der der Abfrage zugrunde liegenden Datenbasis/Query.


Die Sache mit dem "F" habe ich erstmal noch zurückgestellt.
Vielleicht kann mir noch jemand helfen...

Dirk
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Datenauswertung mit SQL-Befehl?

  Alt 18. Apr 2008, 21:46
Ich weiss jetzt nicht so genau wo dein Problem ist.

Diese Abfrage liefert doch dein gewünschtes Ergebnis...
SQL-Code:
SELECT MONTH(a.f_date) AS monat, YEAR(a.f_date) AS jahr, a.f_name, COUNT(*) AS anzahl
FROM tbl_daten a
LEFT JOIN tbl_daten b
  ON ( a.f_date = b.f_date + 1
      AND b.f_content IN ('W', 'F'))
WHERE a.f_content IN ('W', 'F')
  AND b.nameID IS NULL
GROUP BY a.f_name, MONTH(a.f_date), YEAR(a.f_date)
Sonst müsstest du nochmal genau erklären was du wie haben möchtest und bitte wieder mit ordentlichen Beispieldaten. Deine Angaben sind einfach nicht präzise genug.
Ich kann nunmal keine Gedanken lesen, sorry.

Über den LEFT-Join wird ein vorhandener Folgetag, wenn vorhanden, mit dem aktuellen verknüpft. Es werden nur Zeilen mit einem Content W oder F berücksichtigt. Das bedeutet, ein Zyklus erhält verknüpfte Zeilen, nur die letzte Zeile in einem Zyklus findet keinen Folgetag mehr und somit sind alle Spalten in "b" gleich NULL diese Zeilen werden dann gezählt und genau dafür ist das b.nameID IS NULL dort kann auch jede andere Spalte von "b" benutzt werden.
  Mit Zitat antworten Zitat
d6lpz

Registriert seit: 26. Mär 2008
73 Beiträge
 
Delphi 6 Professional
 
#19

Re: Datenauswertung mit SQL-Befehl?

  Alt 19. Apr 2008, 06:33
Hallo und danke für deine Geduld
Zitat:
Über den LEFT-Join wird ein vorhandener Folgetag, wenn vorhanden, mit dem aktuellen verknüpft. Es werden nur Zeilen mit einem Content W oder F berücksichtigt. Das bedeutet, ein Zyklus erhält verknüpfte Zeilen, nur die letzte Zeile in einem Zyklus findet keinen Folgetag mehr und somit sind alle Spalten in "b" gleich NULL diese Zeilen werden dann gezählt und genau dafür ist das b.nameID IS NULL dort kann auch jede andere Spalte von "b" benutzt werden.
Habe mich jetzt etwas weitergehend mit SQL befasst, allerdings kann ich mein Problem immer noch nicht selbst lösen

Ich habe meine Bsp DB noch einmal mit Daten überarbeitet/ergänzt und angehangen.
Es müßte folgendes herauskommen:
SQL_tab_V1 ->

User1 Jan=2 Feb=2
User2 Jan=3 Feb=1
User3 Jan=4 Feb=3

oder in der zweiten Variante

SQL_tab_V2 ->

User1 Jan=1 Feb=1
User2 Jan=2 Feb=2
User3 Jan=3 Feb=3
Wenn ich bei der Variante 2 für den User2 am 01./02.02.2008 ein "S" reinschreibe und damit den Zyklus nur zwei Tage eher anfangenlasse, wird dieser Zyklus auch korrekt gezählt. Warum kann ich mir nicht erklären. Möglicherweise weil diese zwei Tage bei der Sortierung nach Monaten die ersten Tage in der Liste (Monat) sind??

Vielleicht kann sich das noch einmal jemand ansehen bitte.

PS: Ich greife mit D6 auf diese Access2000 DB zu. Die SQL's habe ich aber bis jetzt nur in Access getestet.
Danke für eure Mühen.
Dirk

EDIT -> 08:25

Drei Sachen habe ich jetzt festgestellt (jetzt erst leider):

1. User1 hat zwei Einträge mit dem 10.01.2008 - bitte einen löschen
2. Als nirgendwo ein "S" eingetragen war, werden die "F" Zyklen gezählt (auch logisch bei "IN ('S','F')" )
Mein Fehler - habe ich wahrscheinlich nicht richtig erklärt.
Ziel war die "S" Zyklen zu zählen und wenn zwischen zwei "S" ein oder mehrere "F" auftauchen, sollen die "S" Zyklen zu einem Zyklus zusammengezählt werden. Die "F" Zyklen sind ansonsten nicht interessant.
3. Angenommen nirgendwo steht ein "S" drinnen und die Daten sind so eingegeben wie in der "tbl_daten_ORIGINAL".
dann erhalte ich für User1 und User2 für Jan 3 Zyklen und für Feb 1 Zyklus (nämlich die drei bzw einen "F" Zyklen).
Schreibe ich dann für User1 am 06.01.2008 ein "S" rein hat der User1 richtigerweise (zwar nicht wie ich es haben will aber laut SQL richtig) im Jan 4 Zyklen.
Schreibe ich dieses "S" für User1 nicht in den 06.01.2008 sondern in den 07.01.2008 rein, also unmittelbar vor einem "F", müßte der User1 im Jan 3 Zyklen haben (weil "S" und "F" stehen zusammen).
User1 hat zwar nur 3 Zyklen aber User2 hat einen weniger nämlich zwei.
Dafür habe ich überhaupt keine Erklärung

Ich hoffe irgendjemand fühlt sich herausgefordert und ist bei diesem Wirrwar noch in der Lage und Willens, etwas zur Lösung des Knotens beizutragen.

many thanks
Dirk

EDIT 08:50 -> Austausch der Bsp DB (mit Korrektur)
Angehängte Dateien
Dateityp: rar testv3_260.rar (12,3 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: Datenauswertung mit SQL-Befehl?

  Alt 19. Apr 2008, 10:47
Irgendwie bin ich jetzt verwirrt.

Wo kommt jetzt das S her? Wo ist das W geblieben?

Kannst du mal bitte alle deine Situationen auflisten, die es geben kann? Deine Beschreibungen machen einen nur kirre. Es ist völlig egal was nicht geht, erkläre einfach was gehen soll. Anders geht man da nur unter.

Was passiert bei...

WFFFFF: ein Zyklus?
SFFFFF: ein Zyklus? -> User1 Jan=2 ok
FFFFFF: kein Zyklus? -> User1 Feb=2 wieso? dort ist doch gar kein S also eigentlich 0?

Was passiert bei einem Wechsel über eine Monatsgrenze?

Was ist mit den anderen Statuskonstanten?

Soll das alles in einer SQL-Anweisung ausgewertet werden?

Du machst es einem wirklich sehr schwer dir zu helfen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz