Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenauswertung mit SQL-Befehl? (https://www.delphipraxis.net/112193-datenauswertung-mit-sql-befehl.html)

alzaimar 17. Apr 2008 16:35

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

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.

d6lpz 17. Apr 2008 17:04

Re: Datenauswertung mit SQL-Befehl?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

omata 17. Apr 2008 19:38

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

Zitat von omata
Kannst du nicht mal ein konkretes Beispiel liefern, was du wie hast und was du eigentlich genau haben möchtest?

Zitat:

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:

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)

d6lpz 18. Apr 2008 14:31

Re: Datenauswertung mit SQL-Befehl?
 
Hallo - du bist DER Held! :thumb:

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:

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 :gruebel:

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 :bounce2:

Dirk

alzaimar 18. Apr 2008 14:34

Re: Datenauswertung mit SQL-Befehl?
 
Manchmal sind die Tabellen- bzw. Datenkonstrukte nicht geeignet, um effektive Auswertungen fahren zu können

omata 18. Apr 2008 14:42

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

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)

d6lpz 18. Apr 2008 17:19

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

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

omata 18. Apr 2008 21:46

Re: Datenauswertung mit SQL-Befehl?
 
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.

d6lpz 19. Apr 2008 06:33

Re: Datenauswertung mit SQL-Befehl?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und danke für deine Geduld :thumb:
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. :gruebel:

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 :wall:

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)

omata 19. Apr 2008 10:47

Re: Datenauswertung mit SQL-Befehl?
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz