Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Pivot der Spaltenwerte

Sie können Fensterfunktionen und bedingte Aggregation verwenden:

select
    rn,
    max(case when occupation = 'Doctor' then name end) doctor,
    max(case when occupation = 'Singer' then name end) singer,
    max(case when occupation = 'Actor'  then name end) actor
from (
    select t.*, row_number() over(partition by occupation order by name) rn
    from mytable t
)
group by rn

Die Unterabfrage ordnet Personen mit gleichem Beruf nach Namen. Sie können diese Informationen dann verwenden, um die Zeilen zu generieren, und mit einem bedingten Aggregat auf den entsprechenden Namen für jeden Beruf zugreifen.

Ohne Fensterfunktionen ist es anders. Wenn Ihre Daten nicht zu groß sind, emuliert eine Option die Zeilennummer mit einer Unterabfrage:

select
    rn,
    max(case when occupation = 'Doctor' then name end) doctor,
    max(case when occupation = 'Singer' then name end) singer,
    max(case when occupation = 'Actor'  then name end) actor
from (
    select t.*, 
        (
            select count(*) 
            from mytable t1 
            where t1.occupation = t.occupation and t1.name <= t.name
        ) rn
    from mytable t
)
group by rn