PDA

View Full Version : Nummerierung innerhalb einer Gruppierung



Burkhard
17-01-07, 11:45
Dieses von Frau B.Hauser entlehnte und angepasste, nachstehende Beispiel nummeriert die Zeilen der Ergebnismenge.

Nun soll ein SQL erstellt werden, das je gleicher Gruppe (bestehend aus den ersten 10 Stellen von "Text") eine neue Nummerierung von 1 bis n erfolgt.
Ich bin leider nicht in der Lage, eine Lösung zu finden.
Vielleicht weiß jemand von Ihnen Rat.

Vielen Dank im Voraus.

Burkhard

with x as (select digits(TLfirm) concat ' '
concat digits(TLTOUR) concat ' '
concat digits(LRTZEI) as Text
from VDBDTAPKFT/LRHSTA02, VDBDTAPKFT/TOULZU02
where TLFIRM = LRFIRM and TLSTOR = LRSTOR and
TLABTL = LRABTL and TLLIRH = LRLIRH and TLFIRM = 1
group by TLFIRM, TLTOUR, LRTZEI),
y as (select substr(Text, 1, 15) as yText,
substr(Text, 1, 15) as yKey from x),
z as (select Text as zText,
substr(Text, 1, 15) as zkey from x)
select yText, count(ykey) as Nummer
from y join z on yKey >= zKey
group by yText
____________________________

Ergebnis ist:
YTEXT NUMMER
001 00101 01700 1
001 00110 00830 2
001 00110 01130 3
001 00110 01400 4
001 00120 00700 5
001 00120 00900 6
001 00120 01300 7
001 00130 00900 8
001 00130 01200 9

Ergebnis soll:
YTEXT NUMMER
001 00101 01700 1
001 00110 00830 1
001 00110 01130 2
001 00110 01400 3
001 00120 00700 1
001 00120 00900 2
001 00120 01300 3
001 00130 00900 1
001 00130 01200 2

B.Hauser
17-01-07, 20:01
Hallo Burkhard,

auf welchem Release arbeitest Du?
Falls Du schon auf Release V5R4 bist, kannst Du das Ganze viel einfacher haben.

Mit Release V5R4 wurden OLAP-Ranking Funktionen eingeführt, mit deren Hilfe SQL-Statements ganz einfach durchnummeriert werden können.

Im folgenden Beispiel, wird eine laufende Nr. nach TotalKunde absteigend ermittelt und angezeigt. Obwohl die laufende Nr. nach TotalKunde vergeben wurde kann das Ergebnis nach KundeNr ausgegeben werden.

select Row_Number() over(Order By TotalKunde Desc) RowNbr, KundeNr, TotalKunde
from Summe
where Jahr = 2005
order By KundeNr;

In dem vorherigen Beispiel wurde nur das Jahr 2005 aufgelistet. Jetzt sollen alle Jahre aufgelistet werden und die Nummerierung pro Jahr erfolgen. In diesem Fall würde das SQL-Statement wie folgt aussehen:


select Row_Number() over(Partition By Jahr Order By TotalKunde Desc) RowNbr,
Jahr, KundeNr, TotalKunde
from Summe
order By Jahr, KundeNr;


In Deinem Beispiel könnte das irgendwie so aussehen:

with x as (select substr(MyText, 1, 10) as Sort, MyText
from Text)
select RowNumber() over(Partition by Sort Order by MyText) as RowNbr,
x.*from x;

Für vor Release V5R4 fällt mir zumindest im Moment keine einfache Lösung ein.

Birgitta

Burkhard
18-01-07, 07:27
Derzeit sind wir noch auf V5R3M7 aber bald ....

Vielen Dank für Ihr Engagenment.

BUrkhard