Reputation: 21
I Have a table like below,
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
I want my query to output like below (multiple columns instead of multiple rows)
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
I can achieve the desired result with multiple pivots in a multiple CTEs and joining them together. http://sqlfiddle.com/#!3/efef0/2
Is there anyway to achieve this with a single pivot?
Upvotes: 1
Views: 366
Reputation: 10908
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
Upvotes: 2
Reputation: 52645
There's nothing stopping you from doing an old school 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
Upvotes: 1