[NEWSboard IBMi Forum]

Thema: SQL left join

  1. #1
    Registriert seit
    Nov 2005
    Beiträge
    29

    SQL left join

    Hallo,

    ich habe ein riesen Problem mit SQL auf der i5.

    Ich habe eine Umsatzdatei, in der die Umsätze monatsweise - spaltenweise gespeichert sind (12 Spalten).
    Jedes Jahr ist aber Zeilenweise gespeichert (Feld Jahr). Deshalb möchte ich mit folgender SQL-Anweisung die Umsätze eines Kunden von 2006 und 2005 in einem Datensatz zurückgemeldet bekommen (normalerweise wären das zwei Datensätze, einer für 2005 und einer für 2006)

    Code:
    SELECT 
    a.Kunde, a.Artikel, a.Menge, a.Wert,
    b.Kunde, b.Artikel, b.Menge, b.Wert
     
    FROM UMSATZ as a
    left join UMSATZ as b ON (a.Kunde = b.Kunde and a.Artikel = b.Artikel)
    WHERE (a.Jahr='2006' and a.Kunde='Testkunde' and b.Jahr='2005' ) or
          (a.Jahr='2006' and a.Kunde='TestKunde' and b.Jahr is NULL)
     
    order by a.Artikel
    Durch den left Join dachte ich, ich bekommen alle Sätze von 2006 und wenns von 2005 auch Sätze für diese Artikel gibt, sind die Felder gefüllt, wenn 2005 keine da sind, sind die Felder leer.

    Leider kommen immer nur die Datensätze, wo 2006 und 2005 Datensätze vorhanden sind. Genauer gesagt, wenn ich ohne left join, nur die Sätze von 2006 hole, sind´s 224, wenn ich die Sätze von 2005 hole, sind´s 222, mit Left join, alles in einem Datensatz sind auch nur 222. Ich will aber 224, und bei 2 Datensätze soll in b.Artikel,b.Kunde,b.Menge,b.Wert nichts drinstehen.
    Kann mir einer weiterhelfen. Ich habe schon das Forum durchgewühlt (auch den Rest des Internets) aber ausser "IS NULL" nichts gefunden, aber das geht auch irgendwie nicht.

    Danke im Voraus.

    mfg A.Hingerl

  2. #2
    Registriert seit
    Nov 2005
    Beiträge
    5
    SELECT
    -- Spalten
    A.ABCD, A.ACCD
    -- Tabellen
    FROM "XXX"/"TAB2" A
    WHERE (A.ABCD > '')
    -- Verknüpfungsbedingungen
    AND NOT EXISTS ( SELECT B.ABCD FROM "XXX"/"TAB1" B
    WHERE (A.ABCD = B.ABCD) )
    ORDER BY A.ABCD

    Ausgabe in Datei TAB3



    Mal als Idee, mit dem join habe ich es auch nicht hingekriegt, die leere Verknüpfungsbedingung: WHERE (A.ABCD > '') und das: AND NOT EXISTS ( SELECT B.ABCD FROM "XXX"/"TAB1" B
    WHERE (A.ABCD = B.ABCD) ) haben mir die Spalten mit Minus Zeichen gefüllt. Aber immerhin!

  3. #3
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Hallo,

    wie wäre es mit so was in der Art wie:

    Code:
    select 
      tab.kunde, tab.art, sum(tab.m1), wert(tab.w1), sum(tab.m2), sum(tab.w2)
    from
      ( select kunde, art, menge m1, wert w1, 0 m2, 0 w2  from Umsatz  where jahr=2005
        union
        select kunde, art, 0 m1, 0 w1, menge m2, wert w2  from Umsatz  where jahr=2006 )   as tab
    group by
      tab.kunde, tab.art
    order by
      tab.kunde, tab.art
    kann es leider nicht ausprobieren...

    Gruß
    Christian

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Da in der Join-Beziehung nur Kunde und Artikel genannt ist, kann der Or-Zweig nie erfüllt werden, da nunmal b.Jahr nie NULL ist.

    Cristians Lösung ist da eleganter, insbesonders, da auch Sätze von 2005 ausgewählt werden, die in 2006 nicht vorhanden ist.

    Falls "from (select ...) " noch nicht unterstützt werden kann man auch mit folgendem Konstrukt arbeiten:

    with
    xUmsatz as
    (select kunde, art, menge m1, wert w1, 0 m2, 0 w2 from Umsatz where jahr=2005
    union
    select kunde, art, 0 m1, 0 w1, menge m2, wert w2 from Umsatz where jahr=2006)
    select
    tab.kunde, tab.art, sum(tab.m1), wert(tab.w1), sum(tab.m2), sum(tab.w2)
    from xUmsatz
    group by
    tab.kunde, tab.art
    order by
    tab.kunde, tab.art
    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

  5. #5
    Registriert seit
    Nov 2005
    Beiträge
    29
    @Fuerchau,Christian

    Danke. Hat geklappt. Hab zwar etwas gebraucht, bis ich die Lösung mit UNION kappiert habe, aber jetzt ist´s eigentlich einleuchtend. Hab zwar zwei Zeilen (2006 und 2005) aber durchs gruppieren dann nur noch eine mit den Feldern für 2006 und 2005; genial, manchmal fürchte ich mich vor euch :-).

    @Fuerchau
    Das mit dem Join auf Kunde und Artikel und dem OR-Zweig hab ich noch nicht ganz kappiert. Meine SQL-Anweisung ist etwas komplexer, mehr Join-Bedingungen und mehr WHERE bedinungen. Ich habs euch nur verkürzt reingeschrieben. Aber jetzt gehts in diesem Fall mit der UNION - Lösung. Ich hab aber grundsätzlich dieses Problem, das manchmal mit left join und dann auf die gejointe Tabelle noch ein paar where bedingungen, nicht alle Datensätze ausgegeben werden. Da ich das ganze für ne mittelständische Firma, viele Umsatz- und Deckungsbeitragslisten und sonstiges Listenmaterial erstellen muss, muss ich mir das noch genauer reinziehen. Aber vorest mal "RIESEN DANK!!"

    mfg A.Hingerl

  6. #6
    Registriert seit
    Nov 2005
    Beiträge
    29

    hilfe, abweichende SQL Ergebnisse

    Ich trau SQL keinen Meter mehr!

    ich habe zwei SQL abfragen, der einzige unterschied ist, einmal nur nach Kunde gruppiert, das andere mal nach kunde und Artikel gruppiert. Sollte eigentlich beide male das gleiche Ergebniss sein. Aber dem ist nicht so.

    Code:
    select 
      x.stpknr,x.stidnr,
               sum(x.stuw01) as stuw01, sum(x.stuw02) as stuw02, sum(x.stuw03) as stuw03,
               sum(x.stuw04) as stuw04, sum(x.stuw05) as stuw05, sum(x.stuw06) as stuw06,
               sum(x.stuw07) as stuw07, sum(x.stuw08) as stuw08, sum(x.stuw09) as stuw09,
               sum(x.stuw10) as stuw10, sum(x.stuw11) as stuw11, sum(x.stuw12) as stuw12,
               sum(x.Vstuw01) as Vstuw01, sum(x.Vstuw02) as Vstuw02, sum(x.Vstuw03) as Vstuw03,
               sum(x.Vstuw04) as Vstuw04, sum(x.Vstuw05) as Vstuw05, sum(x.Vstuw06) as Vstuw06,
               sum(x.Vstuw07) as Vstuw07, sum(x.Vstuw08) as Vstuw08, sum(x.Vstuw09) as Vstuw09,
               sum(x.Vstuw10) as Vstuw10, sum(x.Vstuw11) as Vstuw11, sum(x.Vstuw12) as Vstuw12
    from 
    ( select stpknr, stidnr,stuw01,stuw02,stuw03,stuw04,stuw05,stuw06,stuw07,stuw08,stuw09,stuw10,stuw11,stuw12, 
                     0 as Vstuw01, 0 as Vstuw02,0 as Vstuw03,0 as Vstuw04,0 as Vstuw05,0 as Vstuw06,
                     0 as Vstuw07, 0 as Vstuw08,0 as Vstuw09,0 as Vstuw10,0 as Vstuw11,0 as Vstuw12
      from cmddtar6_0.istopp where stpknr='1416250' and stygja='106' and stanws='VKS' and stfirm='777'
     union
      select stpknr, stidnr, 0 as stuw01, 0 as stuw02,0 as stuw03,0 as stuw04,0 as stuw05,0 as stuw06,
                     0 as stuw07, 0 as stuw08,0 as stuw09,0 as stuw10,0 as stuw11,0 as stuw12,
                     stuw01 as Vstuw01, stuw02 as Vstuw02, stuw03 as Vstuw03, stuw04 as Vstuw04, stuw05 as Vstuw05, stuw06 as Vstuw06,
                     stuw07 as Vstuw07, stuw08 as Vstuw08, stuw09 as Vstuw09, stuw10 as Vstuw10, stuw11 as Vstuw11, stuw12 as Vstuw12
      from cmddtar6_0.istopp where stpknr='1416250' and stygja='105' and stanws='VKS' and stfirm='777') as x
    group by stpknr,stidnr
    Code:
    select 
      x.stpknr,sum(x.stuw01) as stuw01, sum(x.stuw02) as stuw02, sum(x.stuw03) as stuw03,
               sum(x.stuw04) as stuw04, sum(x.stuw05) as stuw05, sum(x.stuw06) as stuw06,
               sum(x.stuw07) as stuw07, sum(x.stuw08) as stuw08, sum(x.stuw09) as stuw09,
               sum(x.stuw10) as stuw10, sum(x.stuw11) as stuw11, sum(x.stuw12) as stuw12,
               sum(x.Vstuw01) as Vstuw01, sum(x.Vstuw02) as Vstuw02, sum(x.Vstuw03) as Vstuw03,
               sum(x.Vstuw04) as Vstuw04, sum(x.Vstuw05) as Vstuw05, sum(x.Vstuw06) as Vstuw06,
               sum(x.Vstuw07) as Vstuw07, sum(x.Vstuw08) as Vstuw08, sum(x.Vstuw09) as Vstuw09,
               sum(x.Vstuw10) as Vstuw10, sum(x.Vstuw11) as Vstuw11, sum(x.Vstuw12) as Vstuw12
    from 
    ( select stpknr, stuw01,stuw02,stuw03,stuw04,stuw05,stuw06,stuw07,stuw08,stuw09,stuw10,stuw11,stuw12, 
                     0 as Vstuw01, 0 as Vstuw02,0 as Vstuw03,0 as Vstuw04,0 as Vstuw05,0 as Vstuw06,
                     0 as Vstuw07, 0 as Vstuw08,0 as Vstuw09,0 as Vstuw10,0 as Vstuw11,0 as Vstuw12
      from cmddtar6_0.istopp where stpknr='1416250' and stygja='106' and stanws='VKS' and stfirm='777'
     union
      select stpknr, 0 as stuw01, 0 as stuw02,0 as stuw03,0 as stuw04,0 as stuw05,0 as stuw06,
                     0 as stuw07, 0 as stuw08,0 as stuw09,0 as stuw10,0 as stuw11,0 as stuw12,
                     stuw01 as Vstuw01, stuw02 as Vstuw02, stuw03 as Vstuw03, stuw04 as Vstuw04, stuw05 as Vstuw05, stuw06 as Vstuw06,
                     stuw07 as Vstuw07, stuw08 as Vstuw08, stuw09 as Vstuw09, stuw10 as Vstuw10, stuw11 as Vstuw11, stuw12 as Vstuw12
      from cmddtar6_0.istopp where stpknr='1416250' and stygja='105' and stanws='VKS' and stfirm='777') as x
    group by stpknr
    Bitte um euere Hilfe.

    Danke.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun, dazu muss man den UNION verstehen.
    Default heißt dieser UNION DISTINCT !
    Wenn also im 1. Select und im 2. Select identische Sätze (also alle Felder) auftreten, wird nur einer genommen.
    Da du aber alle Daten benötigst musst du dies explizit erwähnen mit UNION ALL !
    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

  8. #8
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Meinen Dank an dieser Stelle speziell an Birgitta, von der ich hier im Forum viel über SQL gelernt habe!


    Gruß
    Christian

  9. #9
    Registriert seit
    Nov 2005
    Beiträge
    29
    Danke, Danke.

    Dazu muss ich jetzt sagen, hätte ich zuerst den UNION etwas besser studieren sollen. Dieses mal gilt, das was ich zu anderen immer sag, ausnahmsweise mal für mich: Der Fehler sitzt vor den Tasten :-)

Similar Threads

  1. SQL inner join
    By Robi in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 22-06-07, 15:52
  2. SQL - Join mit Bedingung und Update
    By cassi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 22-11-06, 15:03
  3. SQL JOIN
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 19-10-06, 07:56
  4. MS Access ODBC mit JOIN: SQL FEHLER666
    By olafu in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-10-06, 08:13
  5. QMQRY LEFT OUTER JOIN
    By Matthias.Hayn in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 06-12-04, 13:33

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •