Anmelden

View Full Version : SQL Problem



ILEMax
10-04-08, 13:31
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 !

woki
10-04-08, 14:16
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

woki
10-04-08, 14:17
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

ILEMax
10-04-08, 14:50
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

B.Hauser
10-04-08, 15:19
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

B.Hauser
10-04-08, 15:23
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.

ILEMax
10-04-08, 18:08
Sehr geehrte Frau Hauser, liebe Birgitta
das war genau das, was ich brauchte.
Supi, vielen Dank

der ILEMax