Entwickler-Ecke

Datenbanken - SQL: Berechnete Felder mit Zusammenfassung


UGrohne - Fr 11.10.02 15:05
Titel: SQL: Berechnete Felder mit Zusammenfassung
Hallo,
mein Problem ist etwas komplex:
Ich habe drei Tabellen: Artikel, Aufträge und Kunden.

In der Auftragsansicht werden diese mit Left Outer Joins zusammengesetzt (damit ich auch Name des Kunden usw hab). Ein Auftrag kann aus mehreren Artikeln bestehen, deswegen habe ich einen Auftrag für jeden Artikel, die dann über eine gemeinsame GID (sog. Group-ID) zusammengesetzt werden.

Jetzt möchte ich für die Auftragsansicht folgendes realisieren:
Für jede Auftragsgruppe, also gleiche GID, soll nur ein Datensatz angezeigt werden, dieser soll aber die Gesamtkosten der Einzelartikel zusammenrechnen.

Folgendes habe ich mal probiert:


Quelltext
1:
2:
3:
4:
5:
SELECT auftr.gid AS Auftrag, (SELECT SUM(Gesamt) FROM auftraege WHERE GID=auftr.gid) AS Gesamt,
knd.name, knd.vorname
FROM auftraege auftr
LEFT OUTER JOIN kunden knd ON auftr.kunde=knd.knr
ORDER BY auftr.GID;


Habe schon alles mögliche probiert das klappt alles net, vll. hat jemand eine Idee? Verwende übrigens Interbase 6 OS

Danke im Voraus.

Uwe


UGrohne - Fr 11.10.02 16:31

OK, hat sich erledigt, habs selbst rausgefunden.

Das Problem war, dass Select Distinct nicht funktioniert hat, wegen der Summenberechnung. Ich habe jetzt ein View erzeugt und dieses dann mit SELECT DISTINCT * FROM groupedauftr aufgerufen, jetzt funktioniert das einwandfrei.

Trotzdem danke.....

*g*


Cashels - Sa 12.10.02 13:14

Hi,

deine Lösung scheint ja zu klappen, aber rein prinzipiell hast du einen strukturellen Fehler in deiner Datenbank. Normalerweise trennst du deine Auftraege Tabelle auf in 2 einzelne. Nenn die 1. Auftrag wo du nur auftragspezifische Dinge drin beinhaltest (z.B. Kundennr, Auftragnr, Datum...), und erstell eine 2. die du bsp. "Positionen" nennst, welche über einen Schlüssel mit der Tabelle Auftrag verknüpft, und ansonsten artikelspezifische Dinge enthält, wie z.B. Artikelpreis, Beschreibung, Anzahl usw.)...

Der Grund für diese Aufpsaltung sind eigentlich 2:
- Zum einen hast du in deiner Struktur wahrscheinlich Daten redundant gespeichert, und
- zum anderen wird deine Abfrage wesentlich einfacher und vor allem auch schneller (Stichwort "group by" in deiner Select Abfrage).

Gruss,
Tom


UGrohne - Sa 12.10.02 19:56

Damit hast Du schon recht, das einzige Problem bei der Sache ist, dass ich meinem Kunden nicht zumuten kann, eine fast neue DB-Struktur aufzubauen, erstens dauert es zu lange, zweitens muss ich dann erstmal noch ein Konvertierungstool beilegen, damit keine Daten verloren gehen.

Anfangs wollte er eben Einzelpositionen, jetzt will er Auftragsgruppen und da ist meine Anpassung zeitlich von Vorteil. Es muss bei dem halt alles so schnell wie möglich auf seiner Platte sein....

Typisch Kunden eben, 5 vor 12 angerannt kommen und dann auch noch meckern, wenns 5 vor immer noch net da ist. :lol:

Trotzdem danke für den Tipp, das kommt dann in die Verkaufsversion rein *g*