Version: Microsoft SQL Server 2014SQL Server: les valeurs de tri en colonnes comme avec pivot dynamique
J'ai créé avec succès un tableau croisé dynamique dynamique (avec l'aide), et maintenant j'ai une question concernant les noms de colonnes et leurs valeurs .
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ','
+ QUOTENAME('Component_' + cast(rn as varchar(10)))
FROM dbo.table
CROSS APPLY
(SELECT row_number() over(partition by UPC order by ComponentNum) rn
FROM dbo.table) x
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT UPC, ' + @cols + ' FROM
(
SELECT UPC, ComponentNum,
''Component_''
+ cast(row_number() over(partition by UPC order by ComponentNum) as varchar(10)) val
FROM dbo.table) x
PIVOT
(
MAX(ComponentNum)
FOR val IN (' + @cols + ')
) p '
execute(@query)
Après la table a été pivotée, il a créé 27 colonnes de Component_X
.
Les 27 colonnes sont censées représenter différents types de pièces associées à un numéro UPC unique. Tous les UPC n'ont pas 27 types de pièces.
Il semble que, selon le numéro de ligne indiqué dans le groupe partitionné de numéros UPC, l'emplacement où il a été affecté dans la colonne pivot.
Cela m'indique que j'ai besoin de trier les données d'origine avant d'exécuter le pivot, non? En regardant le tableau de résultat ci-dessous, vous pouvez voir que le numéro de pièce 543
est montré sous Component_13
, Component_1
, et Component_10
pour différents numéros CUP.
ID UPC Component_13 Component_1 Component_10
------------------------------------------------------------------------
1 123 543 NULL 345
2 321 345 543 765
3 213 654 345 NULL
4 312 765 NULL 543
Mon problème est que je ne peux pas laisser flotter le numéro de pièce entre différentes colonnes. Si le numéro de pièce est de type "Component_13"
, il doit rester dans cette colonne.
Mon objectif est que chaque itération de Component_X
représente un type de pièce spécifique.
Component_1 = Bolts
Component_2 = Nuts
Component_3 = Washers
L'autre problème est que j'ai besoin aussi d'énumérer plusieurs références « Bolt » dans leur propre colonne pour la récupération par un autre logiciel. Tout numéro UPC peut avoir un nombre quelconque de «boulons» de différentes tailles avec des numéros de pièce différents.
table résultat final pourrait ressembler à:
ID UPC Bolt1 Bolt2 Bolt3 Nut1 Nut2
------------------------------------------------------------------------
1 123 1.5 1 NULL 0.5 .375
2 321 2.0 NULL NULL .625 NULL
3 213 0.25 .875 .375 NULL NULL
4 312 NULL NULL NULL 1.25 .625
Ceci est probablement pas possible, mais je devais demander si quelqu'un pouvait aider à trouver une solution.
@marc_s ce format est généré automatiquement par dbfiddle – McNets