动态SQL Server数据透视表

前端之家收集整理的这篇文章主要介绍了动态SQL Server数据透视表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现了一个很好的脚本,可以通过我的数据透视表的列名动态创建,但是我没有将指定的值重新放回到表中.这是我的起始桌.
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,'')

这给了我以下输出

[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

解决方法

从选择中删除ORDER_ID,然后选择列名称
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 |
原文链接:/mssql/83382.html

猜你在找的MsSQL相关文章