-
SQL Ermittlung von Summen über eine nicht verknüpfte Datei/Tabelle
Hallo zusammen,
ich möchte gerne in eine bereits existierende SQL-Abfrage zwei neue Felder als Summenfelder mittels der SUM() Funktion hinzufügen, habe jedoch für mich ein größeres Problem, dass sich wie folgt darstellt.
Die Dateien 1+2+3 kann ich mittels Feld KDNR eindeutig (LEFT JOIN) verknüpfen -
Datei4 enthält jedoch nicht für jeden Kunden Beträge!!!
Hier meine gedachte SQL-Anweisung
SELECT
-- Spalten
A.KDNR AS KONTO,
B.WAEC AS WAE,
SUBSTR(A.NAM1, 1, 2) AS NAME,
SUBSTR(C.ESTR, 1, 2) AS STRASSE,
SUBSTR(C.EORT, 1, 2) AS ORT,
SUM(D.JS01) AS B1
-- Tabellen
FROM "DATEI1" A
"DATEI2" B
"DATEI3" C
--> NEUE Datei mit den Beträge für die Funktion SUM() nach Kunde!!
"DATEI4" D
-- Verknüpfungsbedingungen
AND (A.KDNR = B.KDNR)
AND (B.KDNR = C.KDNR)
--> ACHTUNG: nicht für jeden KDNR in DATEI4 existieren Einträge!!
AND (C.KDNR = D.KDNR)
-- Sortierspalten
GROUP BY
A.KDNR, B.WAEC, A.NAM1, C.ESTR, C.EORT
-- Sortierspalten
ORDER BY A.KDNR
Hier wäre mein gewünschtes Resultat
KONTO WAE NAME STRASSE ORT B1
----- --- ---- ------- --- -------------------------
01003 1 Bi Rh Em 116.492,23
01005 1 Ge Kr Wu 224.320,07
01010 1 C. Ep He 25.514,96
Es fehlen jedoch Kunden = keine Beträge vorhanden!!
KONTO WAE NAME STRASSE ORT
----- --- ---- ------- ---
01002 1 Cl Ni Lü
01003 1 Bi Rh Em
01004 1 He Re He
01005 1 Ge Kr Wu
Was und wie kann ich nun vorgehen und meine SQL-Anweisung anpassen, damit ich zu meinem gewünschten Resultat gelange - nun möchte ich euch hier um eure Hilfe bitten - VIELEN DANK im voraus!!
Liebe Grüße
MiMarkow
-
Da verwendest du noch alte SQL-Syntax. Dies ist (fast) immer ein "inner join".
Du solltest das so umbauen:
Alt:
FROM "DATEI1" A
"DATEI2" B
"DATEI3" C
"DATEI4" D
Neu:
FROM "DATEI1" A
inner join "DATEI2" B on A.KDNR = B.KDNR
inner join "DATEI3" C on B.KDNR = C.KDNR
left join "DATEI4" D on B.KDNR = D.KDNR
Inner join = Die Beziehung muss Sätze haben
Left join = Die Beziehung kann Sätze haben
Aus der Where-Klausel lässt du das dann raus.
Allerdings kann die SUM(...) bei nicht vorhandenen Sätzen NULL ergeben.
Du benötigst dann im Programm einen NULL-Anzeiger.
Alternativ kannst du auch "coalesce(SUM(...), 0)" nehmen, wenn die Unterscheidung zwischen NULL, also nichts, oder 0 nicht relevant ist.
-
Hallo Herr Fuerchau,
vielen lieben Dank für Ihren raschen Lösungsvorschlag - dieser funktioniert leider nur zur Häfte.
Die Where-Klausel kann ich nicht auschließen, da über diese noch eine Prüfung auf das Währungs-KZ in Datei4 stattfinden muss - schließe ich diese Prüfung aus, werden alle Währungen je Betragsfeld in das jeweilige Summenfeld aufaddiert und das ist nicht richtig.
Ich erhalte somit die selbe unvollständige Auflistung meiner Konten.
Liebe Grüße
MiMarkow
-
Wenn Du noch was bzgl. Datei4 verknüpfen willst, darfst Du das nicht in der WHERE-Klausel machen, sondern musst das in der LEFT JOIN Verknüpfung machen.
Gruß,
KM
-
Hallo KM,
das funktioniert, das heißt somit, dass ich für etwaige Einschränkungen bzw. Prüfungen diese an der/den Verknüpfungen vornehmen muss.
Wie sieht denn zur Alternative die Verknüpfung der Dateien aus, wenn ich auf meine WHERE-Klausel nicht verzichten möchte?
Liebe Grüße
MiMarkow
-
... bei outer joins werden die "ergänzten" Sätze (das sind die, die kein Pendant haben) mit Null Values im Resultset aufgenommen. Für null gilt eine dreiwertige Logik: Alle Vergleiche mit Null liefern false, null is also weder gleich ungleich, größer oder kleiner als jeder andere Wert. Die einzige Operation mit null, die TRUE liefert, ist die spezielle Abfrage ISNULL. Wenn ich also einen Vergleich in dei Where Klausel schieben will, muss ich entsprechend mit IS NOT NULL sicherstellen, dass da nix wegdüst. In der Join Klausel ist das einfacher und eleganter.
In manchen Fällen kann man da auch im View Layer die Nullfelder mit coalesce in blanks oder 0 tauschen. (wenn's die fachliche Logik erlaubt)
D*B
-
Warum willst Du denn so sehr an der WHERE-Klausel festhalten? Wenn Du nur INNER JOINs hast, dann kannst Du ruhig die WHERE-Klausel verwenden. Aber wenn auch andere Joins vorkommen, dann besteht die Gefahr, dass Dir Sätze durch die Lappen gehen.
Gruß,
KM
-
Ich hatte bis dato noch nicht so viel mit SQL zu tun und wenn, dann eher über die einfache Schiene mittels strqm, meistens aber mit wrkqry, daher meine Anfrage und wie heißt es so schön im Leben, es führen immer mehrere Wege nach Rom = Lösung!!
Und da man ja auch niemals auslernt, hatte ich diese Anfrage gleich nachgeschoben!!
Das wichtigste aber ist, dass ihr mir alle ganz super toll geholfen habt und ich eine funktioniernde SQL-Abfrage habe - vielen lieben Dank!!!
Liebe Grüße
MiMarkow
-
Von der Logik und dem SQL-Standard her ist die alte Join-Logik eben veraltet da sie eher kompliziert wird.
Sobald man nämlich in einer Where-Klausel ein Feld auf einen Nicht-NULL-Wert vergleicht, optimiert SQL automatisch auf einen Inner Join.
Die on-Klausel ist annähernd mit einer Where-Klausel vergleichbar, aber nicht identisch. Einiges geht, manches eben nicht, z.B. scalare Subselect. Man kann aber durchaus einfache skalare Berechnungen durchführen und mit diesem Ergebnis vergleichen.
In die On-Klausel gehört erstens die Beziehung und ggf. zweitens eine weitere Einschränkung die NULL-Ergebnisse liefern darf.
In die Where-Klausel gehören dann die tatsächlichen Filter auf das Gesamtergebnis wobei eben Left-Joins nicht mehr weiter gefiltert werden dürfen, da sie sonst wieder zu Inner Joins werden da, wie Dieter schon beschreibt ein Vergleich mit NULL und einem Wert nie TRUE wird.
-
Hallo Herr Fuerchau,
vielen Dank für Ihre detaillierte Beschreibung - das hilft mir sehr weiter!!
Similar Threads
-
By _MG_ in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 14-12-16, 15:45
-
By AK1 in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 26-10-16, 12:59
-
By Robi in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 07-01-16, 07:40
-
By mott in forum IBM i Hauptforum
Antworten: 13
Letzter Beitrag: 16-12-15, 15:55
-
By labm in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 22-04-14, 14:30
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks