2017-05-06 5 views
0

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.

Répondre

0

Vous pouvez utiliser REPLICATE pour générer un nombre à deux chiffres ou plus qui peut être facilement commandé.

create table test(rn varchar(10)); 

insert into test 
values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10'), ('11'), ('12'); 

select num 
from 
    (select 'Component_' + replicate('0', 2 - len(rn)) + rn as num 
     from test) x 
order by num; 

Résultat:

| num   | 
| :----------- | 
| Component_01 | 
| Component_02 | 
| Component_03 | 
| Component_04 | 
| Component_05 | 
| Component_06 | 
| Component_07 | 
| Component_08 | 
| Component_09 | 
| Component_10 | 
| Component_11 | 
| Component_12 | 

dbfiddle here

+0

@marc_s ce format est généré automatiquement par dbfiddle – McNets