PDA

View Full Version : SQL Selektion u. Ausgabe von Zeilen



Seiten : [1] 2

MiMarkow
29-03-17, 11:32
Hallo zusammen,

ich möchte über eine SQL-Abfrage eine neue Ausgabe erzeugen welche am Ende pro Kunde immer nur einen und zwar den letzten aktuellen Satz ausgeben soll - ich habe jedoch noch keine Möglichkeit gefunden, diese per SQL zu lösen.

Im folgenden Beispiel sind die beiden Dateien 1+2 mittels eines INNER JOIN miteinander verknüpft -

SELECT
-- Spalten
A.KDNR AS KONTO,
MAX(CAST(SUBSTR(B.GEJA, 1, 4) AS DECIMAL)) AS JAHR,
B.EIWT AS WERT
-- Tabellen
FROM "DATEI1" A
Inner Join "DATEI2" B ON A.KDNR = B.KDNR
-- Zeilenauswahl
WHERE ((A.KZAB = 3))
-- Sortierspalten
GROUP BY A.KDNR, B.GEJA, B.EIWT
-- Sortierspalten
ORDER BY A.KDNR, B.GEJA DESC

KONTO JAHR WERT
----- ------- ---------------
60001 2.014 57.677,00 < z.B.
60004 1.996 4.729,45 < z.B.
60004 1.995 9.458,90
60004 1.994 4.729,45
60005 2.013 2.275,00 < z.B.
60005 2.011 43.650,00
60005 2.010 37.680,00
60005 2.009 27.840,00
60006 2.009 100.260,00 < z.B.
60006 2.008 259.596,00
60006 2.007 133.056,00
60006 2.006 128.160,00
60006 2.005 62.784,00
60006 2.003 40.813,00

ich benötige aus Datei2 immer nur den Satz mit der letzten/neuesten Jahreszeile, funktioniert also nicht?!

Im 2ten Beispiel sind die beiden Dateien 1+2 mittels eines RIGHT OUTER JOIN miteinander verknüpft -

SELECT
-- Spalten
A.KDNR AS KONTO,
MAX(CAST(SUBSTR(B.GEJA, 1, 4) AS DECIMAL)) AS JAHR,
SUM(B.EIWT) AS WERT
-- Tabellen
FROM "DATEI1" A
Right Outer Join "DATEI2" B ON A.KDNR = B.KDNR
-- Zeilenauswahl
WHERE ((A.KZAB = 3))
-- Sortierspalten
GROUP BY A.KDNR
-- Sortierspalten
ORDER BY A.KDNR, B.GEJA DESC

KONTO JAHR WERT
----- ------- -------------------
60001 2.014 57.677,00
60004 1.996 18.917,80
60005 2.013 292.890,89
60006 2.009 1.007.442,17

hier stimmen zwar die letzten/neuesten Zeilen mit der Jahreszahl, die Werte stimmen jedoch nicht, da diesse aufsummiert werden!!

Was und wie kann ich nun vorgehen 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

Fuerchau
29-03-17, 12:17
Mehrere Fehler:
Wenn du "Max(B.GEJA)" verwendest, kannst du nicht einfach im Group by B.GEJA verwenden, das sind verschiedene Ausdrücke.
Ausdrücke im Select sind im Group by zu wiederholen.

Hier empfehle ich dann eine partielle derived Table für den Join:

select a.kdnr as konto, b.geja, b.eiwt
from dateia a
, lateral
(select geja, eiwt from dateib b
where a.kdnr = b.kdnr
order by geja desc
fetch first 1 rows only
)
where ...

BenderD
29-03-17, 12:36
... und zwar den letzten aktuellen Satz ausgeben soll ...


Was ist denn "der letzte"? SQL kennt keine sequentielle Verarbeitung (kann man höchstens mit Funktion RRN drumherumwürgen, kostet aber Leistung)

D*B

Fuerchau
29-03-17, 12:40
@Dieter
Im Raten warst du da aber schon mal besser...

BenderD
29-03-17, 13:01
@Baldur:
... meinst Du, das wär schon raus, wer besser geraten hat?

MiMarkow
29-03-17, 13:24
Hallo zusammen,

zu allererst vielen Dank an Herrn Fuerchau -

dieser Tipp/Vorschlag funktionert, habe es hinbekommen!!

SELECT A.KDNR,
CAST(SUBSTR(B.GEJA, 1, 4) AS DECIMAL) AS Jahr,
B.EIWT
FROM "LIB"."DATEI1" A,
LATERAL (SELECT GEJA, EIWT from "LIB"."DATEI2" B
WHERE A.KDNR = B.KDNR
ORDER BY GEJA DESC
FETCH FIRST 1 ROWS ONLY ) B
WHERE A.BTRK = 1

Nun aber eine weitere Frage dazu und zwar kann man in der Regel die iSeries SQL-Anweisung(en) in MS-Query einbinden, diese jedoch läuft auf einen Fehler - "Tabelle 'LITERAL' konnte nicht hinzugefügt werden"?!?!

Vielleicht kann mir bitte hierfür auch jemand weiterhelfen - vielen Dank!!

Liebe Grüße
MiMarkow

BenderD
29-03-17, 13:48
... am einfachsten legt man sich da auf der AS/400 eine View an.

MiMarkow
29-03-17, 13:58
... und wie soll dieser bitte aussehen - DDS Source?!

BenderD
29-03-17, 14:01
... nix DDS! SQL! create view as select ....

Fuerchau
29-03-17, 14:07
wobei du dann allerdings den where rauslasten solltest.