多行到列(枢轴)

时间:2014-06-11 14:36:25

标签: 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          56

我希望我的查询输出如下(多列而不是多行)

classid     ClassStDate     Rate1_M     Rate1_F     Rate2_M     Rate2_F     Rate3_M     Rate3_F     Rate4_M     Rate4_F
1           2014-08-01      30          26          40          36          50          46          60          56

我可以通过多个CTE中的多个枢轴实现所需的结果并将它们连接在一起。 http://sqlfiddle.com/#!3/efef0/2

无论如何只用一个支点实现这个目标吗?

2 个答案:

答案 0 :(得分:2)

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

Fiddle

答案 1 :(得分:1)

没有什么可以阻止你做旧学校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

Fiddle