J'ai lu les informations sur les tableaux croisés dynamiques MS et j'ai toujours des problèmes pour obtenir ce correct.
J'ai une table temporaire en cours de création, nous dirons que la colonne 1 est un numéro de magasin, et la colonne 2 est un numéro de semaine et enfin la colonne 3 est un total d'un certain type. De plus, les numéros de semaine sont dynamiques, les numéros de magasin sont statiques.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
J'aimerais qu'il apparaisse sous forme de tableau croisé dynamique, comme ceci:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Stockez les chiffres sur le côté et les semaines sur le dessus.
Réponses:
Si vous utilisez SQL Server 2005+, vous pouvez utiliser la
PIVOT
fonction pour transformer les données des lignes en colonnes.Il semble que vous devrez utiliser sql dynamique si les semaines sont inconnues, mais il est plus facile de voir le code correct en utilisant une version codée en dur au départ.
Tout d'abord, voici quelques définitions de tableaux rapides et des données à utiliser:
Si vos valeurs sont connues, vous coderez en dur la requête:
Voir la démo SQL
Ensuite, si vous devez générer dynamiquement le numéro de semaine, votre code sera:
Voir la démo SQL .
La version dynamique, génère la liste des
week
nombres qui doivent être convertis en colonnes. Les deux donnent le même résultat:la source
cte3 AS (select ... )
alors vous avez la logique définie ci-dessus avec le@cols
et@query
... il y a une erreur .` Nom d'objet non valide 'cte3'.` comment résoudre ce problème. -STUFF(...)
auparavant (ou lesXML PATH
deux). Pour le bénéfice des autres lecteurs, tout ce qui se fait, c'est joindre les noms des colonnes et couper la virgule principale. Remarque Je pense que ce qui suit est légèrement plus simple: sélectionnez @cols = (SELECT DISTINCT QUOTENAME (Week) + ',' from yt order by 1 FOR XML PATH ('')) set @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... remplacer legroup by
pardistinct
etorder by 1
et couper manuellement une virgule suffixée !C'est pour un nombre de semaines dynamique.
Exemple complet ici: SQL Dynamic Pivot
la source
J'ai réalisé la même chose auparavant en utilisant des sous-requêtes. Donc, si votre table d'origine s'appelait StoreCountsByWeek et que vous disposiez d'une table distincte répertoriant les ID de magasin, elle ressemblerait à ceci:
Un avantage de cette méthode est que la syntaxe est plus claire et facilite la jointure à d'autres tables pour extraire également d'autres champs dans les résultats.
Mes résultats anecdotiques sont que l'exécution de cette requête sur quelques milliers de lignes s'est terminée en moins d'une seconde, et j'avais en fait 7 sous-requêtes. Mais comme indiqué dans les commentaires, il est plus coûteux de le faire de cette façon, alors faites attention à utiliser cette méthode si vous vous attendez à ce qu'elle s'exécute sur de grandes quantités de données.
la source
Voici ce que vous pouvez faire:
DEMO
la source
J'écris un sp qui pourrait être utile à cet effet, fondamentalement ce sp pivote n'importe quelle table et retourne une nouvelle table pivotée ou retourne juste l'ensemble de données, c'est la façon de l'exécuter:
veuillez noter que dans le paramètre @agg, les noms des colonnes doivent être avec
'['
et le paramètre doit se terminer par une virgule','
SP
Voici un exemple d'exécution:
puis
Select * From ##TEMPORAL1PVT
renverrait:la source
la source
Voici une révision de la réponse @Tayrn ci-dessus qui pourrait vous aider à comprendre le pivotement un peu plus facilement:
Ce n'est peut-être pas la meilleure façon de le faire, mais c'est ce qui m'a aidé à comprendre comment faire pivoter les tableaux.
ID = lignes que vous souhaitez faire pivoter
MY_KEY = la colonne que vous sélectionnez dans votre tableau d'origine qui contient les noms de colonnes que vous souhaitez faire pivoter.
VAL = la valeur que vous souhaitez renvoyer sous chaque colonne.
MAX (VAL) => Peut être remplacé par d'autres fonctions d'agrégation. SUM (VAL), MIN (VAL), ETC ...
la source
Donnez-vous simplement une idée de la façon dont d'autres bases de données résolvent ce problème.
DolphinDB
a également un support intégré pour le pivotement et le sql semble beaucoup plus intuitif et soigné. C'est aussi simple que de spécifier la colonne clé (Store
), la colonne pivotante (Week
) et la métrique calculée (sum(xCount)
).DolphinDB est une base de données hautes performances en colonnes. Le calcul dans la démo coûte aussi peu que 546 ms sur un ordinateur portable dell xps (i7 cpu). Pour obtenir plus de détails, veuillez consulter le manuel DolphinDB en ligne https://www.dolphindb.com/help/index.html?pivotby.html
la source