【问题标题】:Dynamic SQL Server Pivot Table动态 SQL Server 数据透视表
【发布时间】:2013-02-09 03:53:09
【问题描述】:

我找到了一个很好的脚本,它可以通过列名为我的数据透视表动态创建,但我没有将分配的值返回到表中。这是我的起始表。

ORDER_ID    DSC_NAME        NAME
----------- --------------- -----------
2           34-1500-XXX     DWG_DOC
3           C0403           EQIP_1
4           C4054           EQIP_2
1           34-1500-013     PART
0           88-0000         PRCS

我运行此 SQL 以在我的数据透视表中生成我想要的列

DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct 
           ',' + QUOTENAME(NAME)
               FROM test
               FOR XML PATH(''), TYPE
               ).value('.', 'NVARCHAR(MAX)') 
               ,1,1,'')

这给了我以下输出

[DWG_DOC],[EQIP_1],[EQIP_2],[PART],[PRCS]

当我为数据透视表运行动态 SQL 时

SET @query = 'SELECT ' + @cols + ' from 
         (
            SELECT ORDER_ID,DSC_NAME
            FROM test
        ) x
        pivot 
        (
            MIN(ORDER_ID)
            for DSC_NAME in (' + @cols + ')
        ) p '

execute(@query)

我看到了这个结果...

DWG_DOC     EQIP_1      EQIP_2      PART        PRCS
----------- ----------- ----------- ----------- -----------
NULL        NULL        NULL        NULL        NULL

我尝试了几种不同的选项,但我没有想出解决方案来解决为什么这不起作用。

所需的输出将是 ORDER_ID 的列顺序正确的位置

PRCS       PART           DWG_DOC        EQIP_1    EQIP_2    
---------- -------------- -------------- --------- ---------
88-0000    34-1500-013    34-1500-XXX    C0403     C4054     

但这也适用于我的应用程序。

DWG_DOC        EQIP_1    EQIP_2    PART           PRCS
-------------- --------- --------- -------------- -----------
34-1500-XXX    C0403     C4054     34-1500-013    88-0000

【问题讨论】:

    标签: sql tsql dynamic pivot


    【解决方案1】:

    从选择中删除ORDER_ID,并选择列name

    SET @query = 'SELECT ' + @cols + ' from 
             (
                SELECT ORDER_ID, DSC_NAME -- <--- you didn't select the name here
                FROM test
            ) x
            pivot 
            (
                MIN(ORDER_ID)
                for DSC_NAME in (' + @cols + ')
            ) p '
    

    并使用MAX(DSC_Name) 而不是MIN(ORDER_ID)。像这样:

    SET @query = 'SELECT '+ @cols + ' from 
             (
                SELECT DSC_NAME, Name
                FROM test
            ) x
            pivot 
            (
                MAX(DSC_Name)
                for NAME in (' + @cols + ')
            ) p ';
    

    SQL Fiddle Demo

    这会给你:

    |     DWG_DOC | EQIP_1 | EQIP_2 |        PART |    PRCS |
    ---------------------------------------------------------
    | 34-1500-XXX |  C0403 |  C4054 | 34-1500-013 | 88-0000 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2014-07-26
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2018-11-22
      • 2015-06-08
      相关资源
      最近更新 更多