【问题标题】:SQL: Cross tab query to unpivot column names to rowsSQL:跨表查询将列名取消透视到行
【发布时间】:2013-06-16 18:32:42
【问题描述】:

对不起,如果我不清楚。这就是我所拥有的:

Table A

这就是我想要实现的目标:

Table B

基本上,我不想为每个项目设置一个列,而是将所有项目放在一个名为 Code 的列下。这将爆炸我拥有的行数,因为每个项目都有 3 个或更多不同的比率(并且所有百分比也在比率列下)。我知道如何将行转换为列,反之亦然,但为此,我有点迷茫。任何帮助都将不胜感激。

【问题讨论】:

    标签: mysql sql sql-server-2008 oracle-sqldeveloper crosstab


    【解决方案1】:

    假设您使用的是 SQL Server(您的问题中的标签令人困惑,因为您同时拥有 mysql 和 sql-server)并且如果代码数量有限且事先已知,请使用 UNPIVOT

    SELECT Type, Code, Ratio
      FROM 
    ( 
      SELECT Type, HRE, HRF, HRM
        FROM TableA 
    ) s
    UNPIVOT
    ( 
      Ratio FOR Code IN (HRE, HRF, HRM) 
    ) u
    

    这里是SQLFiddle

    现在,如果事先不知道代码的数量,或者只是想动态执行,您可以使用动态 SQL

    DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)
    
    SET @cols = STUFF(
    (
      SELECT DISTINCT ',' + QUOTENAME(name)
        FROM sys.columns 
       WHERE object_id = object_id('TableA') 
         AND name LIKE 'H__'
             FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    
    SET @sql = 
    'SELECT Type, Code, Ratio
      FROM 
    ( 
      SELECT Type, ' + @cols +
    '    FROM TableA 
    ) s
    UNPIVOT
    ( 
      Ratio FOR Code IN (' + @cols + ') 
    ) u'
    
    EXECUTE(@sql)
    

    这里是SQLFiddle

    【讨论】:

    • @rustynails 有帮助吗?您的问题需要更多帮助吗?
    • 你帮了大忙。我不敢相信我没有回复。谢谢好心的先生。
    猜你喜欢
    • 2021-11-16
    • 2023-03-29
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2016-11-09
    相关资源
    最近更新 更多