SQL Server dynamique de PIVOT de la requête?
J'ai été chargé de venir avec un moyen de traduire les données suivantes:
date category amount
1/1/2012 ABC 1000.00
2/1/2012 DEF 500.00
2/1/2012 GHI 800.00
2/10/2012 DEF 700.00
3/1/2012 ABC 1100.00
suivantes:
date ABC DEF GHI
1/1/2012 1000.00
2/1/2012 500.00
2/1/2012 800.00
2/10/2012 700.00
3/1/2012 1100.00
Les taches blanches peuvent être Nuls ou blancs, soit est très bien, et les catégories devraient être dynamique. Un autre inconvénient de cette est que nous allons être en cours d'exécution de la requête dans une capacité limitée, ce qui signifie que les tables temporaires sont sortis. J'ai essayé de recherches et ont atterri sur PIVOT
mais comme je n'ai jamais utilisé avant que je ne comprends vraiment pas, malgré tous mes efforts pour le comprendre. Quelqu'un peut me pointer dans la bonne direction?
- Quelle version de SQL Server s'il vous plaît?
- double possible de Écrire avancées de SQL Select
Vous devez vous connecter pour publier un commentaire.
SQL dynamique PIVOT:
Résultats:
@cols
ensuite, vous pouvez supprimer leDISTINCT
et l'utilisationGROUP BY
etORDER BY
lorsque vous obtenez la liste des@cols
.ORDER BY
pour trier les données.@cols
.SQL dynamique de PIVOT
Approche différente pour créer des colonnes de la chaîne
Résultat
Je sais que cette question est plus vieux mais j'ai été en regardant à travers les réponses et pensé que je pourrais être en mesure de se développer sur la "dynamique" partie du problème et peut-être aider quelqu'un à sortir.
D'abord et avant tout, j'ai construit cette solution pour résoudre un problème d'un couple de collègues de travail avaient avec inconstant et de grands ensembles de données qui ont besoin d'être pivoté rapidement.
Cette solution nécessite la création d'une procédure stockée donc, si c'est hors de question pour vos besoins s'il vous plaît arrêter de lire maintenant.
Cette procédure va prendre dans les principales variables d'un pivot déclaration de créer dynamiquement pivot consolidés pour les différentes tables, les noms de colonnes et les agrégats. La Statique de la colonne est utilisée en tant que groupe par /colonne d'identité pour le pivot(ce peut être dépouillé de ce code si pas nécessaire, mais est assez commun en pivot états et était nécessaire pour résoudre le problème d'origine), le pivot de la colonne est où la fin de la résultante des noms de colonne sera généré à partir de, et la valeur de la colonne est ce que l'ensemble sera appliqué. Le paramètre de Table est le nom de la table dont le schéma (schéma.tablename) cette portion de code pourrait utiliser un peu d'amour, car il n'est pas aussi propre que je voudrais qu'il soit. Il a travaillé pour moi, parce que ma consommation n'a pas été orienté public et de l'injection sql n'a pas été un sujet de préoccupation. Le total paramètre acceptera aucune norme d'agrégation sql 'MOY', 'SOMME', 'MAX' etc. Le code par défaut de MAX comme un agrégat, ce n'est pas nécessaire, mais le public présent a été construit à l'origine pour ne pas comprendre pivots et ont été généralement à l'aide de max comme un agrégat.
Permet de commencer avec le code pour créer la procédure stockée. Ce code doit fonctionner dans toutes les versions de SSMS 2005 et au-dessus, mais je ne l'ai pas testé en 2005 ou en 2016, mais je ne vois pas pourquoi cela ne fonctionnerait pas.
Ensuite, nous allons récupérer nos données sont prêtes pour l'exemple. J'ai pris l'exemple de données à partir de la accepté de répondre avec l'ajout d'un couple d'éléments de données à utiliser dans cette preuve de concept pour montrer la variété des sorties de l'ensemble du changement.
Les exemples suivants montrent la diversité de l'exécution des déclarations montrant la diversité des agrégats, comme un exemple simple. Je n'ai pas le choix de changer la statique, de pivot, et la valeur des colonnes à rester sur un exemple simple. Vous devriez être en mesure de simplement copier et coller le code pour commencer à jouer avec elle-même
Cette exécution renvoie les ensembles de données suivants, respectivement.
Vous pouvez atteindre cet objectif à l'aide de dynamic TSQL (n'oubliez pas d'utiliser QUOTENAME pour éviter les attaques par injection SQL):
Pivots avec des Colonnes Dynamiques dans SQL Server 2005
SQL Server - Dynamique de Tableau croisé dynamique - SQL Injection
Obligatoire de référence pour La Malédiction et la bénédiction de SQL Dynamique
QUOTENAME
seulement aide les attaques par injection SQL, si vous acceptez @nom de la table comme un paramètre à partir d'un utilisateur, et en les ajoutant à une requête commeSET @sql = 'SELECT * FROM ' + @tableName;
. Vous pouvez créer beaucoup d'vulnérables dynamique des chaînes SQL etQUOTENAME
ne vais pas faire un coup de langue pour vous aider.Il y a ma solution le nettoyage de la unnecesary les valeurs null
Le code ci-dessous fournit des résultats qui remplace NULL à zéro dans la sortie.
La création de la Table et d'insertion des données:
Requête pour générer les résultats précis qui remplace aussi NULLE avec des zéros:
De SORTIE :
Version mise à jour pour SQL Server 2017 à l'aide de STRING_AGG fonction pour construire le pivot de la colonne de la liste: