SQL Server : les Colonnes de Lignes
La recherche d'élégant (ou toutes les) solution pour convertir les colonnes de lignes.
Voici un exemple: j'ai une table avec le schéma suivant:
[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]
Voici ce que je veux obtenir comme résultat:
[ID] [EntityId] [IndicatorName] [IndicatorValue]
Et les valeurs de résultat sera:
1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'
Et ainsi de suite..
Cela fait-il sens? Avez-vous des suggestions sur où chercher et comment s'en sortir en T-SQL?
- Avez-vous regardé dans les Pivot/Unpivot encore?
- À la fin de qu'il est allé avec le bluefeet de la solution. Élégant et fonctionnel. Merci beaucoup tout le monde.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le UNPIVOT fonction pour convertir les colonnes en lignes:
Remarque, les types de données des colonnes vous sont unpivoting doivent être les mêmes, de sorte que vous pouvez convertir les types de données avant l'application de la unpivot.
Vous pouvez également utiliser
CROSS APPLY
avec l'UNION de TOUS pour convertir les colonnes:Selon votre version de SQL Server, vous pouvez même utiliser de la CROIX s'APPLIQUENT, avec les VALEURS de la clause:
Enfin, si vous avez 150 colonnes à unpivot et vous ne voulez pas coder en dur l'intégralité de la requête, puis vous pouvez générer l'instruction sql à l'aide de SQL dynamique:
UNPIVOT
et/vsAPPLY
, ce 2010 blog de Brad Schulz (et la suite) est (sont) la belle.eh bien, Si vous avez 150 colonnes, alors je pense que UNPIVOT n'est pas une option. Vous pouvez utiliser xml truc
sql violon démo
Vous pouvez également écrire du SQL dynamique, mais j'aime xml plus - pour le SQL dynamique, vous devez avoir les autorisations pour sélectionner les données directement à partir de la table et qui n'est pas toujours une option.
Mise à JOUR
Comme il y a une grande flamme dans les commentaires, je pense que je vais ajouter quelques avantages et inconvénients de xml/SQL dynamique. Je vais essayer d'être aussi objectif que je pouvais et ne pas mentionner elegantness et uglyness. Si vous avez d'autres avantages et les inconvénients, de modifier la réponse ou de l'écrire dans les commentaires
contre
pros
inserted
etdeleted
tables à l'intérieur de votre déclencher (pas possible avec la dynamique de tous);Juste pour aider les nouveaux lecteurs, j'ai créé un exemple pour mieux comprendre @bluefeet réponse sur UNPIVOT.
Voici une autre méthode pour les colonnes de lignes, combien de table et le nombre de colonnes que vous avez, n'est pas important. Venez de définir les paramètres, et obtenir le résultat.
J'ai écrit cela, parce que parfois j'ai besoin de la suite de la table (qui est la colonne ensemble de résultats), en tant que champs d'une autre table B (qui a à être des champs de ligne). Dans ce cas, je ne sais pas combien de champs, j'ai mis pour ma table B.
J'ai besoin d'une solution pour convertir les colonnes de lignes dans Microsoft SQL Server, sans connaître la colonne (les noms utilisés dans le déclencheur) et sans sql dynamique (dynamic sql est trop lent pour une utilisation dans un déclencheur).
J'ai enfin trouvé cette solution, qui fonctionne très bien:
Comme vous pouvez le voir, j'convertir la ligne en XML (sous-Requête select i,* pour xml brut, ce convertit toutes les colonnes dans une colonne xml)
Puis je CROIX APPLIQUER une fonction à chaque attribut XML de cette colonne, de sorte que je reçois une ligne par attribut.
Dans l'ensemble, cette convertit les colonnes en lignes, sans connaître les noms de colonne et sans l'aide de sql dynamique. Il est assez rapide pour mon but.
(Edit: je viens de voir Romain Pekar réponse ci-dessus, qui est de faire de même.
J'ai utilisé le sql dynamique de déclenchement avec les curseurs de la première, qui était de 10 à 100 fois plus lent que cette solution, mais peut-être qu'il a été causé par le curseur, pas par le sql dynamique. De toute façon, cette solution est très simple et universel, de sorte que son définitivement une option).
Je laisse ce commentaire à cet endroit, parce que je veux faire référence à cette explication dans mon post à propos de la vérification complète de déclenchement, que vous pouvez retrouver ici: https://stackoverflow.com/a/43800286/4160788
Juste parce que je n'ai pas vu mentionné.
Si 2016+, voici encore une autre option pour dynamiquement unpivot de données sans l'aide de SQL Dynamique.
Exemple
Retourne