Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Vertikale Werte horizontal darstellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Chuky666, 25 August 2015.

  1. Chuky666

    Chuky666 Datenbank-Guru

    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 :)
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Wozu?

    Sind alle möglichen Werte von meinh bekannt?
     
  3. Chuky666

    Chuky666 Datenbank-Guru

    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.....>.>
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. ukulele

    ukulele Datenbank-Guru

    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'
     
  6. Distrilec

    Distrilec Datenbank-Guru

    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)
    )
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden