Sql server SQL Server:使用dynamic pivot将值排序到相似的列中

Sql server SQL Server:使用dynamic pivot将值排序到相似的列中,sql-server,sql-server-2014-express,dynamic-pivot,Sql Server,Sql Server 2014 Express,Dynamic Pivot,版本:Microsoft SQL Server 2014 我已经成功地创建了一个动态透视表(在帮助下),现在我有一个关于列名及其值的问题 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME('Component_' + cast(rn as varchar(10)

版本:Microsoft SQL Server 2014

我已经成功地创建了一个动态透视表(在帮助下),现在我有一个关于列名及其值的问题

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列
组件X

27列应表示与唯一UPC编号关联的不同种类的零件。并非所有UPC都有27种部件

似乎根据零件在UPC编号分区组中列出的行号,零件在透视列中的分配位置不同

这表明我需要在运行pivot之前对原始数据进行排序,不是吗?查看下面的结果表,您可以看到零件号
543
显示在不同UPC编号的
组件_13
组件_1
组件_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”
类型,则需要保留在该列中

我的目标是让
组件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
这可能是不可能的,但我不得不问是否有人可以帮助解决这个问题

您可以使用生成一个两位数或更多位数的数字,以便轻松订购

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

@marc\s此格式由dbfiddle自动生成