有人可以帮我转换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以获得结果.这将创建一个将被执行的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 |