2017-05-06 5 views
0

バージョン動的なピボットとLIKEの列に値。SQL Serverの:私は成功した(助けを借りて)動的なピボットテーブルを作成している、と今私は、列名とその値に関する質問があるのMicrosoft SQL Serverの2014</p> <p>:ソート

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) 

テーブルがピボットされた後、Component_Xの27個の列が作成されました。

27個の列は、一意のUPC番号に関連付けられた異なる種類の部分を表すものとします。すべてのUPCに27種類の部品があるわけではありません。

パーツがUPC番号の区切られたグループに記載されている行番号によって、ピボット列に割り当てられた場所が変わっているようです。

これは、ピボットを実行する前に元のデータを並べ替える必要があることを示しています。下の結果表を見ると、異なるUPC番号に対して、部品番号543Component_13Component_1、およびComponent_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を使用すると、簡単に注文できる2桁以上の数字を生成できます。

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; 

結果:

このフォーマットはdbfiddleによって自動的に生成され
| 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 – McNets

関連する問題