Vertikale Werte horizontal darstellen

Chuky666

SQL-Guru
Beiträge
165
Moin moin zusammen :)

wie der Titel schon erahnen lässt habe ich gerade Probleme vertikale Werte horizontal darzustellen und hoffe das ihr mir helfen könnt :)

Ich habe folgende Werte:

artikelNr meinh umren umrez
9001843 KAR 1 1
9001843 PAL 1 198
9001843 ST 43 1
9001843 VE 1 2


Das Ziel soll es sein das die Werte in der Spalte 'meinh' horizontal ausgegeben werden sollen mit den dazugehörigen 'umren' und 'umrez'....

So ungefähr sollte es aussehen:

artikelNr meinh1 umren1 umrez1 meinh2 umren2 umrez2
9001843 PAL 1 198 KAR 1 1

usw... Könnt ihr mir vllt. einen heißen Tip geben wie so etwas zu realisieren wäre?


Vielen dank und grüße :)
 
Werbung:
Die Werte von meinh können noch mehr werte beinhalten(sind alle in einer extra Tabelle gespeichert mit Bezeichnung usw)

Wozu? Weil Chef das so will.....>.>
 
Dann viel Spaß.

Code:
test=*# select * from chuky ;
 art_nr  | meinh | umren | umrez
---------+-------+-------+-------
 9001843 | kar  |  1 |  1
 9001843 | pal  |  1 |  198
 9001843 | st  |  43 |  1
 9001843 | ve  |  1 |  2
(4 rows)

Time: 0,165 ms
test=*# select art_nr, 'kar' as meinh1, sum(umren) filter (where meinh='kar') as umren1, sum(umrez) filter (where meinh='kar') as umrez1, 'pal' as meinh2, sum(umren) filter (where meinh='pal') as umren2, sum(umrez) filter (where meinh='pal') as umrez2 from chuky group by art_nr, meinh1, meinh2 ;
 art_nr  | meinh1 | umren1 | umrez1 | meinh2 | umren2 | umrez2
---------+--------+--------+--------+--------+--------+--------
 9001843 | kar  |  1 |  1 | pal  |  1 |  198
(1 row)

Mal für die ersten 2 Werte, das Prinzip sollte aber so erkennbar sein. FILTER wird Dein M$SQL nicht können, mußt noch umschreiben in CASE WHEN ... Da die Werte für meinh aus einer Tabelle kommen scheint das dynamisch zu sein, Du wirst also den SQL-String dynamisch erstellen müssen und dann ausführen. Siehe erster Satz in dieser Antwort.
 
Die wichtigste Frage ist tatsächlich wie dynamisch das alles sein muss und welche Werte gibt es immer, welche nicht etc. Dann kann man das vieleicht auch mit Joins einfach lösen. Beispiel:
Code:
WITH test(artikelNr,meinh,umren,umrez) AS (
SELECT    9001843,'KAR',1,1
UNION ALL
SELECT    9001843,'PAL',1,198
UNION ALL
SELECT    9001843,'ST',43,1
UNION ALL
SELECT    9001843,'VE',1,2
        )

SELECT    t1.artikelNr,
        t1.meinh AS meinh1,
        t1.umren AS umren1,
        t1.umrez AS umrez1,
        t2.meinh AS meinh2,
        t2.umren AS umren2,
        t2.umrez AS umrez2
FROM    test t1
LEFT JOIN test t2
ON        t1.artikelNr = t2.artikelNr
AND        t2.meinh = 'KAR'
WHERE    t1.meinh = 'PAL'
 
Es gibt grundsätzlich 3 genutzte Methoden...:
1. Group By (@akretschmer Beispiel)
2. Joins (@ukulele Beispiel)
3. (die von mir bevorzugte) der schöne "Pivot"-Befehl (abhängig vom DBMS auch der performanteste Weg)

Ein kleines Beispiel:

Code:
With dat As
(
Select 9001843 as artikelnr, 'KAR' as meinh, 1 as umren, 1 as umrez From dual Union All
Select 9001843, 'PAL', 1, 198 From dual Union All
Select 9001843, 'ST', 43, 1 From dual Union All
Select 9001843, 'VE', 1, 2 From dual
)

Select artikelnr
      ,kar_ren
      ,kar_rez
      ,pal_ren
      ,pal_rez
      ,st_ren
      ,st_rez
      ,ve_ren
      ,ve_rez
From   dat
Pivot
(
Max(umren) as ren, Max(umrez) as rez For (meinh) In ('KAR' as kar, 'PAL' as pal, 'ST' as st, 'VE' as ve)
)
 
Werbung:
Und ergänzend kann man sagen alle drei Wege sind zunächst mal statisch. Wenn es dynamisch werden muss wirds knifflig, kann aber mit allen Varianten umgesetzt werden.
 
Zurück
Oben