Question

Il y a beaucoup de messages là-bas sur les lignes en colonnes pour faire pivoter différentes bases de données. Ils semblent tomber dans deux camps, en utilisant des déclarations de cas ou en utilisant un construit en fonction du fournisseur de base de données. J'utilise MySQL et ai rien trouvé jusqu'à présent sur une fonction intégrée qui me permettra de pivoter sur un nombre inconnu arbitraire de valeurs de la ligne que je veux pivoter en colonnes. Si je ne connais pas les valeurs que je peux à l'avance, ne pas construire les requêtes CAS qui apparaissent fréquemment sur stackoverflow. Je veux savoir s'il y a quelque chose dans MySQL similaire à ceux-ci dans d'autres bases de données où elle est appelée tableau croisé ou pivot:

-Postgresql: http://www.postgresql.org/docs/current /static/tablefunc.html
-Oracle: http://www.oracle-base.com/articles/11g/ PivotAndUnpivotOperators_11gR1.php
-SQL serveur: http://msdn.microsoft.com/en-us/library /ms177410.aspx

Juste pour assurer que je suis clair ce que je demande quand je dis des lignes de pivot à colonnes, je veux transformer une table comme ceci

user_id valeur clé bob cheveux bruns
bob yeux bleus
jake cheveux bruns
jake Hauteur 6'2"

Dans ceci:

user_id hauteur des yeux de cheveux brun bob bleu
brun jake 6'2"

Je cherche spécifiquement une solution MySQL , donc s'il y a qui est spécifique de la base de données de quelque chose de nouveau ou à venir que vous savez cela peut résoudre cela, il serait grandement apprécié.

Était-ce utile?

La solution

Le lien qui Kangkan fourni vous montrer comment retirer ceci vous avait connu les noms de colonnes à l'avance. Nous allons pour la même logique, à l'exception en utilisant SQL dynamique pour construire la déclaration. Il y a 2 parties à chaque champ que vous devez inclure le champ dans l'instruction select et une jointure appropriée pour obtenir la valeur ... donc nous devons construire la déclaration en deux parties

Tout d'abord déclarer 3 variables pour construire ce ... Je vais aller avec @select, @join et @sql pour cet exemple. Donnez les variables les valeurs initiales

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

déclarer maintenant et charger un curseur avec les valeurs distinctes dans le domaine de table.key. Je vais utiliser @field comme variable se rempli avec le champ table.key distinct. Puis boucle à travers elle la construction de deux variables:

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

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

boucle à travers votre curseur sur la construction @select et @join. A la fin de la boucle:

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

SQL dynamique construit comme cela peut être une douleur absolue à tirer des problèmes (et obtenir à droite) et ouvrir les questions de sécurité ... mais il est de la seule façon que je peux voir ce accompli. Surveillez les restrictions de taille sur vos variables .... si vous avez trop distinctes, il est la clé, les variables deviennent trop grandes. Désolé, je ne peux pas être plus précis avec le pseudo sur ce ... vous trouverez la construction sql dynamique sql est laborieux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top