Autor Beitrag
hube
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

WIN XP
D7 Prof
BeitragVerfasst: Do 18.05.06 22:18 
Hallo Zusammen

Ich habe eine Paradox-DB in welcher sämtliche verkauften und nicht verkauften Artikel eingetragen sind. Nun möchte ich eine Auswertung machen, aus welcher ersichtlich wird, welcher Kunde am meisten verkauft hat. Um die Summe aller verkauften Artikel von einem Kunden abzurufen verwende ich folgende Abfrage:

select sum(preis) from lager where status = "verkauft" and eingang_datum > "01.03.2005" and Kundennummer ="1009"

Nun kommen wir zum Problem:
Wie kann ich es anstellen, dass ich als Resultat der Abfrage die jeweilige Summe jedes einzelnen Kunden erhalte (Kundennummer 1001-1180), also wie kann ich so eine Art Schleife bewerkstelligen?

Kann mir da bitte jemand einen Tipp geben?

Besten Dank für Euere Hilfe
hube
FaTaLGuiLLoTiNe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: Do 18.05.06 22:23 
Mit GROUP BY kann man sowas bewerkstelligen.

Ist etwas her, dass ich mich damit beschäftigt habe, könnte aber ungefähr so aussehen:

ausblenden Quelltext
1:
2:
3:
SELECT  kundennummer, SUM(preis) FROM lager
GROUP BY kundennummer
HAVING (eingang_datum > "01.03.2005") AND (status = "verkauft") AND (kundennummer >= "1001" AND kundennummer <= "1180")

_________________
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Do 18.05.06 22:54 
Moin :-)

@FaTaLGuiLLoTiNe: Die HAVING-Klausel funktioniert so nicht, da (zumindest bei LOCAL-SQL) diese nur auf sog. Aggregat-Felder wie SUM() etc anzuwenden ist.
Beispiel:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
SELECT kundennummer, SUM(preis) AS Preis FROM "lager.db" 
   WHERE (status = "verkauft")
   AND (eingang_datum > "01.03.2005")
   AND (kundennummer BETWEEN 1001 AND 1180)
   GROUP BY kundennummer 
   HAVING SUM(preis)>1000


@hube: Versuch's mal so:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
SELECT kundennummer, SUM(preis) AS Preis FROM "lager.db" 
   WHERE (status = "verkauft")
   AND (eingang_datum > "01.03.2005")
   AND (kundennummer BETWEEN 1001 AND 1180)
   GROUP BY kundennummer

Das ist die 'normale' Variante, Wenn Du flexibel sein möchtest, sprich ein anderes eingangsdatum oder einen anderen Kundenkreis, dann empfiehlt sich das ganze zu parametrisieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Query1.SQL.Text := 'SELECT kundennummer, SUM(preis) AS Preis FROM "lager.db" ' +
                   'WHERE (status = "verkauft") ' +
                   'AND (eingang_datum > :EDATUM) ' +
                   'AND (kundennummer BETWEEN :KDNR_VON AND :KDNR_BIS) ' +
                   'GROUP BY kundennummer ';
Query1.Prepare;
//-- 1.Auswahlbeispiel
Query1.Params[0].AsDate := '01.03.2005';
Query1.Params[1].AsInteger := 1001;
Query1.Params[2].AsInteger := 1180;
Query1.Open;

//-- 2.Auswahlbeispiel
Query1.Close;
Query1.Params[0].AsDate := '01.03.2005';
Query1.Params[1].AsInteger := 2001;
Query1.Params[2].AsInteger := 2999;
Query1.Open;
FaTaLGuiLLoTiNe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 5

Windows 7, Windows 8.1
Delphi XE
BeitragVerfasst: Do 18.05.06 23:09 
user profile iconraiguen hat folgendes geschrieben:
@FaTaLGuiLLoTiNe: Die HAVING-Klausel funktioniert so nicht, da (zumindest bei LOCAL-SQL) diese nur auf sog. Aggregat-Felder wie SUM() etc anzuwenden ist.


Ährm, ja, da könnteste durchaus recht haben.

_________________
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
hube Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

WIN XP
D7 Prof
BeitragVerfasst: Fr 19.05.06 06:21 
Jetzt funktioniert es. Vielen Dank für Euere Hilfe.

hube