AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Berechnete Felder aufaddieren
Thema durchsuchen
Ansicht
Themen-Optionen

Berechnete Felder aufaddieren

Ein Thema von Luckie · begonnen am 24. Jun 2005 · letzter Beitrag vom 24. Jun 2005
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 04:53
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-01and '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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 06:54
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-01and '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-01and '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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 08:07
Hallo Luckie,

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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 11:28
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 11:31
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
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Berechnete Felder aufaddieren

  Alt 24. Jun 2005, 11:34
@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
Angehängte Dateien
Dateityp: zip wotestdb_925.zip (31,1 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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