Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pivot SQL des valeurs de colonne

Vous pouvez utiliser les fonctions de fenêtrage et l'agrégation conditionnelle :

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 sous-requête classe les personnes ayant la même occupation par leur nom. Vous pouvez ensuite utiliser ces informations pour générer les lignes et accéder au nom correspondant pour chaque profession avec un agrégat conditionnel.

Sans les fonctions de fenêtre, c'est différent. Si vos données ne sont pas trop volumineuses, une option émule le numéro de ligne avec une sous-requête :

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