[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2017
    Beiträge
    12

    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



  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2017
    Beiträge
    12
    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

  4. #4
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  5. #5
    Registriert seit
    Mar 2017
    Beiträge
    12
    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

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  8. #8
    Registriert seit
    Mar 2017
    Beiträge
    12
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Mar 2017
    Beiträge
    12
    Hallo Herr Fuerchau,

    vielen Dank für Ihre detaillierte Beschreibung - das hilft mir sehr weiter!!

Similar Threads

  1. Antworten: 10
    Letzter Beitrag: 14-12-16, 15:45
  2. Excel-Tabelle / Spalten in phy. Datei
    By AK1 in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 26-10-16, 12:59
  3. unbekannte Datei Feldweise in allg. gültige Tabelle schreiben
    By Robi in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 07-01-16, 07:40
  4. Zugriff auf eine Datei per ODBC
    By mott in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 16-12-15, 15:55
  5. 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
  •