不同的同名SQL列按列名排序

时间:2015-08-14 14:26:19

标签: sql sql-server

我在SQL中有一个表

Category | Subcategory | Region | Count | Percent |
    A    |      Aa     |   ON   |   3   |   5%    |
    A    |      Aa     |   AT   |   1   |   2%    |
    A    |      Ab     |   ON   |   5   |   10%   |
    B    |      Bc     |   AT   |   1   |   21%   |

但是我希望能够创建一个SQL语句,它会给我这样的查询

Category | Subcategory | Region | Count | Percent | Region | Count | Percent |
    A    |      Aa     |   AT   |   1   |   2%    |   ON   |   3   |   5%    |
    A    |      Ab     | NULL/0 | NULL/0|  NULL/0 |   ON   |   5   |  10%    |
    B    |      Bc     |   AT   |   1   |   21%   | NULL/0 | NULL/0|  NULL/0 |

这可以在SQL中作为select或存储过程吗?

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,您应该使用唯一的列名。要获得所需的输出,可以使用条件聚合:

SQL Fiddle

SELECT
    Category,
    SubCategory,
    Region_AT = MAX(CASE WHEN Region = 'AT' THEN Region END),
    Count_AT = MAX(CASE WHEN Region = 'AT' THEN [Count] END),
    Percent_AT = MAX(CASE WHEN Region = 'AT' THEN [Percent] END),
    Region_ON = MAX(CASE WHEN Region = 'ON' THEN Region END),
    Count_ON = MAX(CASE WHEN Region = 'ON' THEN [Count] END),
    Percent_ON = MAX(CASE WHEN Region = 'ON' THEN [Percent] END)
FROM Tbl
GROUP BY Category, SubCategory

如果你不知道有多少Region,你可以使用动态交叉表:

SQL Fiddle

DECLARE @sql1 NVARCHAR(2000) = '',
        @sql2 NVARCHAR(2000) = '',
        @sql3 NVARCHAR(2000) = ''

SELECT @sql1 =
'SELECT
    Category
    , SubCategory' + CHAR(10)

SELECT @sql2 = @sql2 +
'   , MAX(CASE WHEN Region = ''' + Region + ''' THEN Region END) AS Region_' + Region + CHAR(10) +
'   , MAX(CASE WHEN Region = ''' + Region + ''' THEN [Count] END) AS Count_' + Region + CHAR(10) +
'   , MAX(CASE WHEN Region = ''' + Region + ''' THEN [Percent] END) AS Percent_' + Region + CHAR(10)
FROM(
    SELECT DISTINCT Region FROM Tbl
)t

SELECT @sql3 = 
'FROM Tbl
GROUP BY Category, SubCategory'

PRINT (@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)

您可以通过Jeff Moden在这个伟大的article中阅读有关动态交叉表的更多信息。