2017-05-06 92 views
0

版本:微軟SQL服務器2014的SQL Server:排序值到動態透視LIKE列

我已經成功地創建一個動態的數據透視表(有幫助),現在我有一個關於列名和它們的值的問題。

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) 

表格旋轉後,它創建了27列Component_X

27列應該表示與唯一的UPC編號關聯的不同種類的零件。並非所有的UPC都有27種部件。

看來,取決於在UPC編號的分區組中列出部件的行號,它是在透視列中分配的位置。

這表明我需要在運行數據透視之前對原始數據進行排序,否?查看下面的結果表,可以看到對於不同的UPC編號,部件號543顯示在Component_13Component_1Component_10之下。

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 

我的問題是,我不能讓零件號在不同的列之間浮動。如果零件號碼是"Component_13"類型,則需要保留在該列中。

我的目標是讓每個迭代Component_X代表一種特定的部分。

Component_1 = Bolts 
Component_2 = Nuts 
Component_3 = Washers 

的另一個問題是,我還需要通過其他軟件,以多個「博爾特」的零件編號枚舉到自己的列進行檢索。 任何UPC編號可以有不同部件號的不同尺寸的「螺栓」。

最終結果表可能看起來像:

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 

這恐怕是不可能的,但我不得不問,如果任何人都可以用一個解決方案幫助。

回答

0

您可以使用REPLICATE生成一個兩位或更多位的數字,可以輕鬆訂購。

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; 

結果:

| 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這個格式由dbfiddle自動生成 – McNets