【问题标题】:MSSQL dynamic pivot column values to column headerMSSQL 动态透视列值到列标题
【发布时间】:2013-11-10 09:46:03
【问题描述】:

有人可以帮我在 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 |名称2 | 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,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)

非常感谢, 迈克

【问题讨论】:

标签: sql sql-server tsql dynamic pivot


【解决方案1】:

您当前查询的问题在于以下行:

MAX(SERVER_ID)

您希望为每个 PROPERTY_NAME 显示 PROPERTY_CHAR_VALSERVER_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, name2, name3, 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('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' 
            from 
            (
              select id, property_name, 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 |

【讨论】:

  • 你先生是最好的 :@) 我很接近(请参阅第一篇已编辑的帖子)-再次感谢
  • @user2938161 你的查询非常接近,pivot 可能有点痛苦,这就是硬编码有时更容易的原因。 :)
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多