Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Aggreagt Funktion (https://www.delphipraxis.net/131338-aggreagt-funktion.html)

jangbu 23. Mär 2009 17:06

Datenbank: SQL-Server 2000 • Zugriff über: BDE

Aggreagt Funktion
 
Hallo,
habe ein Selektionsproblem.

Bekomme mit folgender Abfrage über die Aggregatfunktion die Artikel sortiert mit ihren Preis-Summen

select artikel,sum(preis)
from tabelle
group by artikel, order by artikel

Wenn ich aber den Gesamt-Preis über die gesamte Abfrage (würde ich normalereise mit Query.on-calc addieren) geht hier aber nicht da ich persistente Felder nicht mit aggregatfunktionen mischen kann, will sagen ich müsste im on-calc Ereignis Query1.FieldByName('Preis') abfragen, Preis ist aber in keiner Aggregatfunktion vorhanden also geht das nicht. Habe keine Idee wie ich, gleichzeitig in dieser Abfrage auch den GesamtPreis ermitteln kann?

jangbu.

mkinzler 23. Mär 2009 17:12

Re: Aggreagt Funktion
 
SQL-Code:
select artikel,sum(preis) as gespreis
from tabelle
group by artikel, order by artikel
sollte eigentlich funktionieren

shmia 23. Mär 2009 17:13

Re: Aggreagt Funktion
 
SQL-Code:
select artikel, sum(preis) AS TotalPreis
from tabelle
group by artikel
UNION ALL
select 'Summe / Total' AS artikel, sum(preis) AS TotalPreis
from tabelle

jangbu 23. Mär 2009 17:40

Re: Aggreagt Funktion
 
Sorry, hab mich wahrscheinlich falsch ausgedrückt. 'Meine Abfrage' bringt das gleiche Ergebnis, wie die beiden geposteten! Das Problem liegt weniger in der SQL-Abfrage als in der weiteren Verarbeitung in Delphi. Ich bekomme natürlich zu jedem Artikel in der Preis-Spalte (sum(preis)) den richtigen Wert. Da sum(preis) aber kein "Datenbankfeld" ist kann ich darüber auch keine Gesamtsumme[b] ermitteln.

DeddyH 23. Mär 2009 17:48

Re: Aggreagt Funktion
 
Wieso willst Du das mit Delphi machen, wenn das per SQL genauso geht? Außerdem ist es doch vollkommen wurscht, ob es sich um ein persistentes oder ein berechnetes Feld handelt.

shmia 23. Mär 2009 17:51

Re: Aggreagt Funktion
 
Du kannst in einem berechneten Feld keine Gesamtsumme über alle Datensätze bilden!!!
Grund: du kannst nicht kontrollieren wie oft OnCalcRecord aufgerufen wird.
Das Event kann für einen Datensatz durchaus mehrfach abgefeuert werden. (Sobald ein DBGrid angeschlossen ist)

Mit berechneten Felder kann man sich nur innerhalb eines Datensatzes austoben.
Jegliche Berechnungen, die über einen Datensatz hinausgehen, können prinzipiell nicht funktionieren.
Du kannst natürlich über alle Datensätze gehen und aufaddieren:
Delphi-Quellcode:
gespreis := 0.0;
query1.first;
while not query1.eof do
begin
  gespreis := gespreis + Query1.FieldByName('gespreis').AsFloat;
  query1.Next;
end;
Mit SQL geht's aber schneller.

DeddyH 23. Mär 2009 17:54

Re: Aggreagt Funktion
 
Zitat:

Zitat von shmia
Du kannst natürlich über alle Datensätze gehen und aufaddieren:
Delphi-Quellcode:
gespreis := 0.0;
query1.first;
while not query1.eof do
begin
  gespreis := gespreis + Query1.FieldByName('gespreis').AsFloat;
  query1.Next;
end;
Mit SQL geht's aber schneller.

Darauf wollte ich hinaus (wie wollt Ihr die Gesamtsumme denn sonst bilden, hab ich da was verpasst?).

jangbu 23. Mär 2009 17:56

Re: Aggreagt Funktion
 
Danke, passt jetzt!

jangbu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr.

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 by Thomas Breitkreuz