【问题标题】:Convert row value in to column in SQL server (PIVOT)在 SQL Server (PIVOT) 中将行值转换为列
【发布时间】:2013-05-30 18:26:45
【问题描述】:

我在 SQL Server 中有一个名为 test 的表,它有 3 列

|  ITEM | ATTRIBUTE | VALUE |
-----------------------------
| item1 |   Quality |     A |
| item1 |     color |   Red |
| item2 |   Quality |     B |
| item2 |     color | Black |

我想要这样的输出:

|  ITEM | QUALITY | COLOR |
---------------------------
| item1 |       A |   Red |
| item2 |       B | Black |

如何在 SQL Server 中获取此信息。

【问题讨论】:

    标签: sql sql-server-2008 pivot


    【解决方案1】:

    试试这个:

    SELECT *
    FROM (SELECT Item, attribute, value FROM MyTable) AS t
    PIVOT
    (
      MAX(value)
      FOR attribute IN([Quality], [Color])
    ) AS p;
    

    输出:

    ╔═══════╦═════════╦═══════╗
    ║ ITEM  ║ QUALITY ║ COLOR ║
    ╠═══════╬═════════╬═══════╣
    ║ item1 ║ A       ║ Red   ║
    ║ item2 ║ B       ║ Black ║
    ╚═══════╩═════════╩═══════╝
    

    this SQLFiddle

    如果不知道attribute的具体值,也可以使用这个动态查询:

    DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(attribute) 
                        from MyTable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query = 'SELECT Item,' + @cols + ' 
                 from 
                 (
                    Select Item, attribute , value
                    from MyTable
                 ) dta
                 pivot 
                 (
                    MAX(Value)
                    for attribute in (' + @cols + ')
                 ) pvt '
    
    execute(@query);
    

    this SQLFiddle

    【讨论】:

    • 在这种情况下,它只给出最大值 Ex item1 NULL RED
    • Item2 B NULL 因为 max 函数
    • @Dilip - 你看到this SQL Fiddle的结果了吗
    • @Dilip - 什么?那么有什么问题呢?在小提琴中,NULL 没有到来。你在尝试别的东西吗?
    • 哦,对不起,是的,它可以工作,我更改了一些数据,这就是为什么问题来了..谢谢。
    【解决方案2】:

    这对于 mysql 来说有点老套,因为 PIVOT 在其中不起作用。

    select item, GROUP_CONCAT('',q) as Quantity, GROUP_CONCAT('',c) as Color from 
    (select item ,CASE WHEN attribute = 'Quality' THEN value ELSE NULL END as q, CASE WHEN attribute = 'Color' THEN value ELSE NULL END as c 
     from MyTable
    ) temp 
    group by item
    

    此解决方案的问题是您应该知道属性列的所有不同值。

    你可以试试here.

    【讨论】:

    • 感谢您的解决方案!您可以使用此guide 来解决此解决方案的问题,并构建动态查询(:
    【解决方案3】:

    也可以使用字符串聚合,

    SELECT item, STRING_AGG(CAST(q AS STRING)) AS Quantity, STRING_AGG(CAST(c AS STRING)) AS Color
    FROM
      (
        SELECT
          item,
          CASE WHEN attribute = 'Quality' THEN value ELSE NULL END AS q,
          CASE WHEN attribute = 'Color' THEN value ELSE NULL END AS c
        FROM MyTable
      ) temp
    GROUP BY item
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多