Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多行到列(透视)_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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