IBM DB2 - Zählen zwischen zwei Werten

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Zvoni

Erfahrenes Mitglied
Mahlzeit.
Jetzt brauche ich mal Hilfe, weil ich sowas noch nie machen musste.
DB = IBM DB2
Bin kein DBA, also nix mit Stored Procedure und Konsorten
Desweiteren weiss ich nicht, inwieweit DB2 CTE und Zeuch unterstützt --> bevorzugte Lösung so nah wie möglich an ANSI-SQL

Problemstellung:
Ich habe eine Tabelle, welche wie folgt aussieht (gekürzt):
TeilenummerPackstück VonPackstück Bis
12345640014010

Ich suche jetzt nach einer SELECT-Abfrage, welches mir folgendes liefert:
TeilenummerPackstück
1234564001
1234564002
1234564003
1234564004
1234564005
1234564006
1234564007
1234564008
1234564009
1234564010

Ideen? Hab mir schon die Finger wund gegooglet, aber irgendwie lande ich dauernd bei ROW_NUMBER.
Ich vermute also eher, dass ich nach den falschen Begriffen suche :)

Mir ist natürlich klar, dass ich per SELECT UNION das auf Zwei Spalten bekomme, aber wie bekomme ich eben halt die Werte (welche berechnet werden müssen), die dazwischen liegen?
MLTENRPN
1234564001
1234564010

SQL:
SELECT MLTENR, MLPNVO AS PN FROM X500PRDSD/LMLI 
WHERE MLTENR='123456' 
UNION 
SELECT MLTENR, MLPNBI AS PN FROM X500PRDSD/LMLI 
WHERE MLTENR='123456' 
ORDER BY PN
 

Yaslaw

alter Rempler
Moderator
Kannst du keine Hilfsatabelle mit den Werten 1 biy 1Million oder so beinhaltet? dann wär es einfach

Tabelle HELPER_NOS
NO
1
2
3
etc


SQL:
-- Achtung, allgemeines SQL. Nicht DB" Spezifisch
select MLTENR, MLPNB
FROM X500PRDSD/LMLI as data, HELPER_NOS as nos
WHERE nos.no BETWEEN data.MLPNVO AND data.MLPNBI
 

Zvoni

Erfahrenes Mitglied
Bin kein DBA, also nix mit Stored Procedure und Konsorten
Dazu gehört leider auch temp/Hilfstabellen.
Hab aber eben gesehen, dass DB2 CTE unterstützt

EDIT: OK, hab eben was gefunden
SQL:
with dummy(id) as (
    select 2 from SYSIBM.SYSDUMMY1    
    union all
    select id + 1 from dummy where id < 4
)
select id from dummy
Ergibt
2
3
4

Wie schaffe ich es jetzt in das CTE den Max-Wert (MLPNBI) bzw. die höchste Zahl an Iterationen durchzuleiten? Die "Abstände" zwischen den zwei Werten können unterschiedlich sein
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Ich glaub ich habs:
SQL:
with dummy(id) as (
    select 0 from SYSIBM.SYSDUMMY1  
    union all
    select id + 1 from dummy where id <
(SELECT MLPNBI-MLPNVO FROM X500PRDSD/LMLI WHERE MLTENR='123456')
)
SELECT MLTENR, MLPNVO+ID AS PN FROM X500PRDSD/LMLI
INNER JOIN dummy ON 1=1
WHERE MLTENR='123456'
Die Frage ist jetzt nur noch: Wie bekomme ich das letzte SELECT (Zeile 5) aus dem CTE raus bzw. wie kann ich MLTENR innerhalb des CTE von aussen setzen?
 

Zvoni

Erfahrenes Mitglied
OK, ich habs jetzt final.
CTE sind temp. VIEWS, und können somit nicht parametriert werden.
SQL:
with dummy(id) as (
    select 0 from SYSIBM.SYSDUMMY1
    union all
    select id + 1 from dummy where id < 9999
)
SELECT MLTENR, MLPNVO+ID AS PN FROM X500PRDSD/LMLI
INNER JOIN dummy ON 1=1
WHERE MLTENR='257246' AND MLPNVO+ID<=MLPNBI
Ich muss in Zeile 4 einen Wert von Hand in das CTE-SQL selbst setzen.
Mit 10.000 Packstücken bin ich mal vorerst auf der sicheren Seite

EDIT: Kein ein Mod, diesen Post als Lösung markieren?
irgendwie kann ich das nicht selbst
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…