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

Existe-t-il un moyen de faire pivoter des lignes vers des colonnes dans MySQL sans utiliser CASE ?

Le lien fourni par Kangkan vous montrera comment procéder si vous connaissiez les noms de colonne à l'avance. Nous optons pour la même logique, à l'exception de l'utilisation de SQL dynamique pour créer l'instruction. Il y a 2 parties dans chaque champ que vous devez inclure, le champ dans l'instruction select et une jointure appropriée pour obtenir la valeur... nous devrons donc construire l'instruction en deux parties

Déclarez d'abord 3 variables pour construire ceci... J'irai avec @select, @join et @sql pour cet exemple. Donnez aux variables les valeurs initiales

 set @select = 'select user_id,'
 set @join = 'from table t'

Déclarez et chargez maintenant un curseur avec les valeurs distinctes dans le champ table.key. Je vais utiliser @field car la variable est remplie avec le champ table.key distinct. Bouclez ensuite dessus en construisant les deux variables :

 set @select = @select + ', ' + @field + '.value as '[email protected]+'
 set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id

(la jointure est conçue pour utiliser la valeur dans @field comme alias de la table)

bouclez votre curseur en construisant @select et @join. A la fin de la boucle :

set @sql = @select + @join + 'where clause if you want'
exec @sql

SQL dynamique construit comme celui-ci peut être une douleur absolue pour dépanner (et corriger) et ouvrir des problèmes de sécurité ... mais c'est à peu près la seule façon dont je peux voir cela accompli. Surveillez les restrictions de taille sur vos variables... si vous avez trop de clés distinctes, les variables deviennent trop grandes. Désolé, je ne peux pas être plus précis avec le pseudo à ce sujet... vous constaterez que la construction de sql dynamique dans sql est laborieuse.