Mysql
 sql >> Database >  >> RDS >> Mysql

SQL ruota i valori della colonna

Puoi utilizzare le funzioni della finestra e l'aggregazione condizionale:

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

La subquery classifica le persone che hanno la stessa occupatin per nome. È quindi possibile utilizzare tali informazioni per generare le righe e accedere al nome corrispondente per ciascuna occupazione con un aggregato condizionale.

Senza le funzioni della finestra, è diverso. Se i tuoi dati non sono troppo grandi, un'opzione emula il numero di riga con una sottoquery:

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