我在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或存储过程吗?
答案 0 :(得分:1)
正如评论中所指出的,您应该使用唯一的列名。要获得所需的输出,可以使用条件聚合:
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
,你可以使用动态交叉表:
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中阅读有关动态交叉表的更多信息。