【问题标题】:SQL Server: sort values Into LIKE columns with dynamic pivotSQL Server:使用动态透视将值排序到 LIKE 列中
【发布时间】:2017-05-06 15:02:31
【问题描述】:

版本: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 列 Component_X

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

根据 UPC 编号分区组中列出的行号,该部分似乎是在数据透视列中分配的位置。

这表明我需要在运行数据透视之前对原始数据进行排序,不是吗?查看下面的结果表,您可以看到部件号 543 显示在 Component_13Component_1Component_10 下,用于不同的 UPC 编号。

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

这可能是不可能的,但我不得不询问是否有人可以提供解决方案。

【问题讨论】:

    标签: sql-server sql-server-2014-express dynamic-pivot


    【解决方案1】:

    您可以使用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

    【讨论】:

    • @marc_s 这个格式是dbfiddle自动生成的
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 2013-09-10
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多