MSSQL动态数据透视表列值到列标题
发布时间:2020-12-12 16:26:41 所属栏目:MsSql教程 来源:网络整理
导读:有人可以帮我转换mssql上的以下内容吗? ID | PROPERTY_NAME | PROPERTY_VALUE 1 | name1 | value 1 | name2 | value 1 | name3 | value 2 | name4 | value 2 | name2 | value 3 | name6 | value.. PROPERTY_NAME PROPERTY_VALUE是标题,id有多个’属性’ 我想
有人可以帮我转换mssql上的以下内容吗?
ID | PROPERTY_NAME | PROPERTY_VALUE 1 | name1 | value 1 | name2 | value 1 | name3 | value 2 | name4 | value 2 | name2 | value 3 | name6 | value .. PROPERTY_NAME& PROPERTY_VALUE是标题,id有多个’属性’ 我想将其转换为: ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME5 | NAME6 | nameETC... 1 | value | value | value | | | | valueETC... 2 | | value | | value | | | valueETC... 3 | | | | | | value | valueETC... .. NAME1 |的地方NAME2 | NAME3等现在是列标题. 我猜一个支点和一个’从MycoolTable选择不同的PROPERTY_NAME’,但似乎无法将两者放在一起. 这是我得到的:(没有server_id)列和所有空的无处不在)显然我是愚蠢的:D DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX); select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,''); SET @query = 'SELECT '+ @cols + ' from ( SELECT SERVER_ID,PROPERTY_NAME,PROPERTY_CHAR_VAL FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] ) x pivot ( MAX(SERVER_ID) for PROPERTY_CHAR_VAL in (' + @cols + ') ) p '; execute(@query) 非常感谢, 解决方法您当前查询的问题在于以下行:MAX(SERVER_ID) 您想要显示每个PROPERTY_NAME的PROPERTY_CHAR_VAL. SERVER_ID将作为列的最终结果的一部分. 有时,当您使用PIVOT时,更容易使用硬编码的值编写代码,类似于: select id,name1,name2,name3,name4 from ( select id,property_name,property_value from yourtable ) d pivot ( max(property_value) for property_name in (name1,name4) ) piv; 见SQL Fiddle with Demo. 一旦拥有了具有正确逻辑的版本,就可以将其转换为动态SQL以获得结果.这将创建一个将被执行的sql字符串,它将包含所有新的列名. DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) from yourtable FOR XML PATH(''),TYPE ).value('.','') set @query = 'SELECT id,' + @cols + ' from ( select id,property_value from yourtable ) x pivot ( max(property_value) for property_name in (' + @cols + ') ) p ' execute sp_executesql @query; 见SQL Fiddle with Demo.两者都会给出结果: | ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 | |----|--------|--------|--------|--------|--------| | 1 | value | value | value | (null) | (null) | | 2 | (null) | value | (null) | value | (null) | | 3 | (null) | (null) | (null) | (null) | value | (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |