Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

d6lpz 16. Apr 2008 15:16

Datenbank: Acc2000 • Zugriff über: ADO

Datenauswertung mit SQL-Befehl?
 
Hallo,

folgendes Problem - ich habe in einer Tabelle folgende Felder:

f_date (Datum)
f_content (Bewertung)
f_name (Person-Name)

Realisieren möchte ich mit SQL soetwas ähnliches wie in der CountIf Funktion in Excel.

Konkret: Ich möchte die Anzahl der Zyklen zählen in denen für die jeweilige Person auf aufeinanderfolgenden Daten der gleiche Content hinterlegt ist.

zb.:

im Zeitraum von ### bis ###

Person1 / 3 Zyklen / Content:"W"
Person2 / 7 Zyklen / Content:"W"
Person3 / 6 Zyklen / Content:"W"

Person1 / 2 Zyklen / Content:"C"
Person2 / 3 Zyklen / Content:"C"
Person3 / 7 Zyklen / Content:"C"

Geht soetwas mit SQL oder muß man den Inhalt der Tabelle einlesen und dann über eine Schleife auswerten?
(Benutzung Array??)
Danke für alle Hinweise
Dirk

omata 17. Apr 2008 00:13

Re: Datenauswertung mit SQL-Befehl?
 
Hallo Dirk,

irgendwie verstehe ich deine Problematik nicht wirklich...

1. Wo stehen in deiner Tabelle die Zyklen?
2. Ich kenne kein CountIf von Excel, kannst du das mal genauer erklären?
3. Kannst du nicht mal ein konkretes Beispiel liefern, was du wie hast und was du eigentlich genau haben möchtest?

So kann man dir leider nicht helfen...

Gruss
Thorsten

alzaimar 17. Apr 2008 06:19

Re: Datenauswertung mit SQL-Befehl?
 
Grundsätzlich geht fast Alles in SQL.

edit: @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!

Also:
SQL-Code:
  select f_name, f_content, count (*) as Zyklen
    from Tabelle
   where f_date between :FromDate and :ToDate
group by f_name, f_content

DeddyH 17. Apr 2008 07:25

Re: Datenauswertung mit SQL-Befehl?
 
Ich hab das so verstanden, dass der selbe Content fortlaufend und unterbrechungsfrei nacheinander stehen muss. Knifflig :gruebel:

alzaimar 17. Apr 2008 07:45

Re: Datenauswertung mit SQL-Befehl?
 
Wenn das so ist, dann benötigt man eine Ordnungsspalte (AutoInc) und ein Self-Join mit Gruppierung oder ein SubSelect. Gar nicht sooo kniffelig.

Aber ohne eine extra Ordnungsspalte bzw. in Access ist das wirklich verdammt kniffelig.

d6lpz 17. Apr 2008 14:19

Re: Datenauswertung mit SQL-Befehl?
 
Danke an alle die sich mit meinem Problem befassen!! :thumb:

Mit Zyklen ist gemeint, dass z.B. vom 01.01.2008 - 05.01.2008 ein "W" in dem Feld 'f_content' steht.
Dann wieder vom 03.03.2008 - 04.03.2008. Das wären dann für den Mitarbeiter "XY" zwei Zyklen im Jahr 2008.

Das für jeden Mitarbeiter und über einen über Parameter zu definierenden Zeitraum (f_date).

Ich habe jetzt versucht über

Delphi-Quellcode:
while not Source.Eof do
begin
     for Counter := 0 to Source.RecordCount-1 do
     begin
     f_date[Counter]:= source.FieldByName('f_date').Value;
     f_name[Counter]:= source.FieldByName('f_name').Value;
     f_content[Counter]:= source.FieldByName('f_content').Value;
     end;
end;
die Daten auszulesen und dann wollte ich sie entsprechend auswerten und das Ergebnis (Namen,Zyklen,Daten) in ein Recordset speichern und dann für einen Report weiterverarbeiten.

Ich merke nur, dass das ein ganz schönes Gefummel ist und dachte das man das irgenwie mit SQL besser lösen kann. :gruebel:
Vielleicht kann mir noch jemand weiter helfen. -> Stichwort SQL Syntax

PS: Die Daten brauchen eigentlich nirgends zwischengespeichert werden. Ich dachte ich kann ein DataSet im "Speicher" mit den Werten füllen und dieses dann der Reportkomponente als Grundlagen zur Verfügung stellen.
Wenn ich ehrlich bin, weiß ich allerdings noch nicht wie das gehen könnte.

Dirk

Peinhard 17. Apr 2008 15:12

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

Zitat von d6lpz
Mit Zyklen ist gemeint, dass z.B. vom 01.01.2008 - 05.01.2008 ein "W" in dem Feld 'f_content' steht.
Dann wieder vom 03.03.2008 - 04.03.2008. Das wären dann für den Mitarbeiter "XY" zwei Zyklen im Jahr 2008.

Und für jedes Datum und jeden Mitarbeiter gibt jeweils einen Datensatz?

Deine beiden Schleifen sehen übrigens gar nicht gut aus - selbst wenn du mit Source.Next in der while-Schleife noch dem Deadlock entfliehen könntest, wirst du in deinem Array doch nur die Werte des letzten Datensatzes finden...

alzaimar 17. Apr 2008 15:22

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

Zitat von d6lpz
und dachte das man das irgenwie mit SQL besser lösen kann. :gruebel: Vielleicht kann mir noch jemand weiter helfen. -> Stichwort SQL Syntax

Zitat:

Zitat von alzaimar
Grundsätzlich geht fast Alles in SQL.
SQL-Code:
  select f_name, f_content, count (*) as Zyklen
    from Tabelle
   where f_date between :FromDate and :ToDate
group by f_name, f_content

Du musst nur statt ':FromData' und ':ToDate' den Zeitraum angeben. Dann erhältst Du eine Tabelle mit der anzahl der Zykle je benutzer im angegebenen Zeitraum.
Zitat:

Zitat von Peinhard
selbst wenn du mit Source.Next in der while-Schleife noch dem Deadlock entfliehen könntest, wirst du in deinem Array doch nur die Werte des letzten Datensatzes finden...

Erstens ist das kein 'Deadlock', sondern eine 'Endlosschleife' und zweitens findet man im Array alle Datensätze. Aber Drittens löst es das Problem nicht.

d6lpz 17. Apr 2008 15:37

Re: Datenauswertung mit SQL-Befehl?
 
1.
Sorry, aber das war natürlich Blödsinn.
So habe ich es wirklich:

Delphi-Quellcode:
while not Source.Eof do
begin
      x_date[counter]:= source.FieldByName('f_date').Value;
      x_name[counter]:= source.FieldByName('f_name').Value;
      x_content[counter]:= source.FieldByName('f_content').Value;
      counter:=counter+1;
source.Next;
end;
2.
Die SQL zählt mir doch nur die Anzahl der "W" pro Mitarbeiter in dem angegebenen Zeitraum - oder verstehe ich da etwas falsch?

Dirk

d6lpz 17. Apr 2008 15:41

Re: Datenauswertung mit SQL-Befehl?
 
Zitat:

Zitat von Peinhard
Und für jedes Datum und jeden Mitarbeiter gibt jeweils einen Datensatz?

Ja - für jeden Mitarbeiter gibt es jeden Tag einen Eintrag.
Dirk


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr.
Seite 1 von 3  1 23      

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