-
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
-
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!
-
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
-
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
-
@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
-
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.
-
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 !
-
Meinen Dank an dieser Stelle speziell an Birgitta, von der ich hier im Forum viel über SQL gelernt habe!
Gruß
Christian
-
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
-
By Robi in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 22-06-07, 15:52
-
By cassi in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 22-11-06, 15:03
-
By steven_r in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 19-10-06, 07:56
-
By olafu in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 05-10-06, 08:13
-
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
-
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