View Full Version : SQL Problem
Hi,
wir haben in einer Datei mehrere Preise
ich soll nun die ersten beiden Preise vergleichen.
Aufbau
lfNr. Produkt Preis ...
manche Produkte hatten in der zwischenzeit 30 - 40 Preise, manche nur genau einen.
Ergebnis soll sein
Produkt Aktueller-Preis vorheriger-Preis Differenz
(höchste lfnr = aktuelle Preis)
hab versucht mit "with" etwas zu zaubern, bin aber anscheinend ein mieser Zauberer.
Mit RPG kein Prob. aber mit SQL?
ach ja, V5R4 ist drauf !
wahrscheinlich nicht die eleganteste Lösung, aber es müßte funktionieren:
select a.produkt, (select b.preis
from preistabelle as b
where b.produkt = a.produkt
and b.lfnr in (select max(c.lfnr)
from preistabelle as c
where c.produkt = b.produkt)) as aktueller_preis,
ifnull((select d.preis
from preistabelle as d
where d.produkt = a.produkt
and d.lfnr in (select max(e.lfnr)-1
from preistabelle as e
where e.produkt = d.produkt)), 0) as vorheriger_preis,
(select f.preis
from preistabelle as f
where f.produkt = a.produkt
and f.lfnr in (select max(g.lfnr)
from preistabelle as g
where g.produkt = f.produkt)) -
ifnull((select h.preis
from preistabelle as h
where h.produkt = a.produkt
and h.lfnr in (select max(i.lfnr)-1
from preistabelle as i
where i.produkt = h.produkt)), 0) as differenz
from produkttabelle as a
wahrscheinlich nicht die eleganteste Lösung, aber es müßte funktionieren:
select a.produkt, (select b.preis
from preistabelle as b
where b.produkt = a.produkt
and b.lfnr in (select max(c.lfnr)
from preistabelle as c
where c.produkt = b.produkt)) as aktueller_preis,
ifnull((select d.preis
from preistabelle as d
where d.produkt = a.produkt
and d.lfnr in (select max(e.lfnr)-1
from preistabelle as e
where e.produkt = d.produkt)), 0) as vorheriger_preis,
(select f.preis
from preistabelle as f
where f.produkt = a.produkt
and f.lfnr in (select max(g.lfnr)
from preistabelle as g
where g.produkt = f.produkt)) -
ifnull((select h.preis
from preistabelle as h
where h.produkt = a.produkt
and h.lfnr in (select max(i.lfnr)-1
from preistabelle as i
where i.produkt = h.produkt)), 0) as differenz
from produkttabelle as a
Hallo woki, danke erstmal.
ich muß schon sagen...
Hut ab, wie kommt man den auf sowas ?
Aber leider ...
beim abtippen ist mir folgendes aufgefallen:
1. kann leider so nicht Funktionieren, da die lfnr Produktübergreifend ist.
Bsp.: Aktueller Preis Produkt A : lfnr 17812 vorheriger Preis Produkt A: lfnr 13213 (das hatte ich so vergessen zu erwähnen)
(@alle die gleich wieder über das Design meckern, ICH hab's nicht erfunden!)
2. wofür ist ifnull(überhaubt) und, wenn ich richtig rate, wofür der der erste ifnull ?
einen aktuellen Preis find ich doch immer, da die Basis ja die Preistabelle und nicht der Produktstamm ist.
Bitte nochmal helfen
danke
ILEMax
Hallo,
versuch's mal damit:
with a as (select Produkt, Min(LfdNr)
as LfdNr1
from MyTable
Group By Produkt),
b as (select x.Produkt, Min(x.LfdNr)
as LfdNr2
from MyTable x join a On a.Produkt = x.Produkt and x.lfdNr > lfdNr1
Group By x.Produkt),
a1 as (Select y.Produkt, y.lfdNr, y.Preis as Preis1 from MyTable y join a on y.Produkt = a.Produkt and lfdNr = lfdNr1),
b1 as (Select z.Produkt, z.lfdNr, z.Preis as Preis2
from MyTable z join b on z.Produkt = b.Produkt and lfdNr = LfdNr2)
select a1.Produkt, Preis1, Preis2
from a1 left outer join b1 using (Produkt)
Order By Produkt;
Birgitta
Hallo,
wahrscheinlich musst Du noch MIN() in MAX() umwandeln und das > Zeichen bei der Verknüpfung umdrehen.
Ich würde ja den Code nochmals editieren, aber ich kommen nicht mehr dran.
Sehr geehrte Frau Hauser, liebe Birgitta
das war genau das, was ich brauchte.
Supi, vielen Dank
der ILEMax