我找到了一个不错的脚本,该脚本可以为透视表动态按列名创建,但是我没有将分配的值重新返回到表中。这是我的出发桌。
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
ORDER_ID从选择中删除,然后选择列name:
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)。像这样:
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 ';
这将为您提供:
| DWG_DOC | EQIP_1 | EQIP_2 | PART | PRCS | --------------------------------------------------------- | 34-1500-XXX | C0403 | C4054 | 34-1500-013 | 88-0000 |