Sql server 多行到列(透视)
我有一张像下面这样的桌子Sql server 多行到列(透视),sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一张像下面这样的桌子 ClassId ClassStDate Gender Rate1 Rate2 Rate3 Rate4 1 2014-08-01 M 30 40 50 60 1 2014-08-01 F 26 36 46
ClassId ClassStDate Gender Rate1 Rate2 Rate3 Rate4
1 2014-08-01 M 30 40 50 60
1 2014-08-01 F 26 36 46 56
我希望我的查询输出如下(多列而不是多行)
我可以在多个CTE中使用多个枢轴并将它们连接在一起,从而达到预期的效果
是否有任何方法可以通过单个轴心实现这一点
WITH t AS (
SELECT
ClassId,
ClassStDate,
RateNum+'_'+Gender AS RateNumGender,
Rate
FROM classes
UNPIVOT(Rate FOR RateNum IN (Rate1,Rate2,Rate3,Rate4)) p
)
SELECT *
FROM t
PIVOT(SUM(Rate) FOR RateNumGender IN (Rate1_M,Rate1_F,Rate2_M,Rate2_F,Rate3_M,Rate3_F,Rate4_M,Rate4_F) )p
没有什么能阻止你做一件老式的MAX/CASE
SELECT
classid ,
ClassStDate,
MAX(case Gender when 'M' THEN Rate1 ELSE NULL END) Rate1_M ,
MAX(case Gender when 'F' THEN Rate1 ELSE NULL END) Rate1_F ,
MAX(case Gender when 'M' THEN Rate2 ELSE NULL END) Rate2_M ,
MAX(case Gender when 'F' THEN Rate2 ELSE NULL END) Rate2_F ,
MAX(case Gender when 'M' THEN Rate3 ELSE NULL END) Rate3_M ,
MAX(case Gender when 'F' THEN Rate3 ELSE NULL END) Rate3_F ,
MAX(case Gender when 'M' THEN Rate4 ELSE NULL END) Rate4_M ,
MAX(case Gender when 'F' THEN Rate4 ELSE NULL END) Rate4_F
FROM
classes
GROUP BY
classid ,
ClassStDate
在数据透视之前,很好地使用了unpivot来“规范化”速率列。我认为这可以归结为个人偏好。在本例中,使用Case或Pivot实际上不会影响性能。
SELECT
classid ,
ClassStDate,
MAX(case Gender when 'M' THEN Rate1 ELSE NULL END) Rate1_M ,
MAX(case Gender when 'F' THEN Rate1 ELSE NULL END) Rate1_F ,
MAX(case Gender when 'M' THEN Rate2 ELSE NULL END) Rate2_M ,
MAX(case Gender when 'F' THEN Rate2 ELSE NULL END) Rate2_F ,
MAX(case Gender when 'M' THEN Rate3 ELSE NULL END) Rate3_M ,
MAX(case Gender when 'F' THEN Rate3 ELSE NULL END) Rate3_F ,
MAX(case Gender when 'M' THEN Rate4 ELSE NULL END) Rate4_M ,
MAX(case Gender when 'F' THEN Rate4 ELSE NULL END) Rate4_F
FROM
classes
GROUP BY
classid ,
ClassStDate