Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Berechnete Felder aufaddieren (https://www.delphipraxis.net/48367-berechnete-felder-aufaddieren.html)

Luckie 24. Jun 2005 03:53


Berechnete Felder aufaddieren
 
Ich habe folgende SQL Abfrage:
SQL-Code:
SELECT count(*), sum(product.erloes), product.product, product.ver
FROM customer
INNER JOIN product
ON customer.idproduct = product.idproduct
WHERE (product.product='XP Usermanager') and (date BETWEEN '2005-04-01' and '2005-06-24')
GROUP BY product.ver
Das ergibt folgende Tabelle:
Code:
count(*) | sum(product.erloes) | product.product | product.ver
3        | 21,30               | XP Usermanager | 3.0
8        | 56,80               | XP Usermanager | 3.1
Jetzt hätte ich es gerne, dass er mir die ersten beiden Spalten aufaddiert und da drunter schreibt:
Code:
count(*) | sum(product.erloes) | product.product | product.ver
3        | 21,30               | XP Usermanager | 3.0
8        | 56,80               | XP Usermanager | 3.1
11       | 78,10               |                 |
Geht das irgendwie?

WoGe 24. Jun 2005 05:54

Re: Berechnete Felder aufaddieren
 
Moin

so früh am morgen

Ich denke 2 Ansätze sind möglich

entweder verpackst du das in eine SP wo du einfach mit adierst

oder, falls deine Tabellen nicht alzu umfangreich sind

nimm UNION
SQL-Code:
SELECT count(*), sum(product.erloes), product.product, product.ver
FROM customer
INNER JOIN product
ON customer.idproduct = product.idproduct
WHERE (product.product='XP Usermanager') and (date BETWEEN '2005-04-01' and '2005-06-24')
GROUP BY product.ver
UNION
SELECT count(*), sum(product.erloes), product.product, product.ver
FROM customer
INNER JOIN product
ON customer.idproduct = product.idproduct
WHERE (product.product='XP Usermanager') and (date BETWEEN '2005-04-01' and '2005-06-24')
Das ist zawr nicht sonderlich elegant und effizient, aber halt schnell geproggt
eventuell noch ein Order by für die 1te Spalte dazumachen, damit deine globaen Summen auch wirklich unten stehen


mfg
wo

marabu 24. Jun 2005 07:07

Re: Berechnete Felder aufaddieren
 
Hallo Luckie,

Zitat:

Zitat von Luckie
Jetzt hätte ich es gerne, dass er mir die ersten beiden Spalten aufaddiert und da drunter schreibt ... Geht das irgendwie?

So wie du es andeutest - Nein. Du kannst mit einem SQL Statement nur einen uniformen result set erstellen, d.h. alle Tupel müssen die gleichen Eigenschaften haben. Deshalb erwarte ich auch, dass eine UNION scheitert. Das zweite Select im Code von WoGe kann nicht funktionieren, da alle nicht aggregierten Attribute einer Selektion in der Group By Klausel auftauchen müssen. Die ersatzweise Ausgabe eines Literals 'SUMMEN' wird z.B. von Interbase nicht mehr als spalten-kompatibel anerkannt.

Das von dir angestrebte Ausgabebild erreichst du wahrscheinlich am wirtschaftlichsten mit einem Report Generator.

Noch ein Satz zu deiner Datenmodellierung. Es sieht zwar aus wie für den Eigengebrauch bestimmt, aber trotzdem - du brauchst eigentlich mindestens drei Tabellen.

customer (id, name, ...)
product (id, name, ver, preis)
sales (id, cus_id, pro_id, menge, umsatz, datum)

Das ganze kann man noch beliebig komplizieren, in dem man history tables für den Preis einführt oder Produktgruppen bildet, aber das interessiert dich wahrscheinlich gar nicht...

Grüße vom marabu

Luckie 24. Jun 2005 10:28

Re: Berechnete Felder aufaddieren
 
Schade. Mit drei Tabellen ginge es einfachher?

Wie du schon erkannt hast, ist es nur für mich privat und war etwas für mich zum Üben und Rumspielen mit MYSQL. Ich will es wirklich nicht übertreiben.

Nachtrag:
@WoGe: Habe dein Posting übersehen. Funktioniert prima, fehlte nur noch ein GROUP BY.

Einziger Schönheitsfehler:
Code:
count(*) | sum(product.erloes) | product.product | product.ver
3        | 21,30               | XP Usermanager | 3.0 
8        | 56,80               | XP Usermanager | 3.1 
11       | 78,10               | XP Usermanager | 3.0
in den Spalten drei und vier sthet eben auch was.

marabu 24. Jun 2005 10:31

Re: Berechnete Felder aufaddieren
 
Zitat:

Zitat von Luckie
Mit drei Tabellen ginge es einfacher?

Wenn du deine Ausgabeliste meinst - Nein. Aber du hättest weniger Anomalien drin, die dich später nerven. Stichwort Normalisierung.

marabu

WoGe 24. Jun 2005 10:34

Re: Berechnete Felder aufaddieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
@marabu
Zitat:

So wie du es andeutest - Nein. Du kannst mit einem SQL Statement nur einen uniformen result set erstellen, d.h. alle Tupel müssen die gleichen Eigenschaften haben.
Das ist so (leider) richtig und ich habe mich auch vom Original-Statement von Luckie verwirren lassen. Das ist nämlich auch falsch.

Aber wenn wir die obige Bedingung erfüllen geht folgendes:

SQL-Code:
SELECT count(*), sum(produkt.erloes), produkt.ver
FROM customer
INNER JOIN produkt
ON customer.produktid = produkt.id
WHERE (produkt.produkt='Apfel')
GROUP BY produkt.ver
union
SELECT count(*), sum(produkt.erloes), produkt.produkt
FROM customer
INNER JOIN produkt
ON customer.produktid = produkt.id
WHERE (produkt.produkt='Apfel')
GROUP BY produkt.produkt
das habe ich mit der angehängten Tabelle getestet. Das Ergebnis sieht in etwa so aus wie das von Luckie
erwartete.
(Wegen der Randbedingungen ist dieses Konstrukt leicht fragwürdig)

mfg
wo

Ach da wart Ihr mal wieder schneller, ich hoffe es nutzt trotzdem was


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 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