动态SQL Server数据透视表
发布时间:2020-12-12 16:24:51 所属栏目:MsSql教程 来源:网络整理
导读:我发现了一个很好的脚本,可以通过我的数据透视表的列名动态创建,但是我没有将指定的值重新放回到表中.这是我的起始桌. ORDER_ID DSC_NAME NAME----------- --------------- -----------2 34-1500-XXX DWG_DOC3 C0403 EQIP_14 C4054 EQIP_21 34-1500-013 PART0
我发现了一个很好的脚本,可以通过我的数据透视表的列名动态创建,但是我没有将指定的值重新放回到表中.这是我的起始桌.
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 | (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |