加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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 |

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读