Hi I am New to SQL Pivoting
I have different requirement where i need to Pivot data based on multiple columns(Q1,Q2,Q3,Q4) based on Categories for Programs. Please advice how can I achieve this?
All examples are based on a single column( eg. SUM(Q1) FOR CategoryID IN ([People], [IT], [Travel])
How do i pivot it based on Q1, Q2, Q3, Q4?
Input
Output
In order to get the result that you want you will have to apply both the UNPIVOT
and the PIVOT
functions.
The unpivot function will convert your Q1
, Q2
, Q3
, and Q4
columns into rows. Once that is done, you will apply the pivot function.
The unpivot code will be similar to this:
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
See SQL Fiddle with Demo. This gives a result:
| PROGRAMID | CAT_COL | VALUE |
----------------------------------
| 366 | Q1_People | 109034 |
| 366 | Q2_People | 25418 |
| 366 | Q3_People | 101130 |
| 366 | Q4_People | 54787 |
You can see that this query creates a new column name to pivot which has the category value and the quarter name.
Once you have this result, you can apply the pivot function:
select *
from
(
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
) d
pivot
(
sum(value)
for cat_col in (Q1_People, Q2_People, Q3_People, Q4_People,
Q1_IT, Q2_IT, Q3_IT, Q4_IT,
Q1_Travel, Q2_Travel, Q3_Travel, Q4_Travel)
) piv
See SQL Fiddle with Demo. This gives the result:
| PROGRAMID | Q1_PEOPLE | Q2_PEOPLE | Q3_PEOPLE | Q4_PEOPLE | Q1_IT | Q2_IT | Q3_IT | Q4_IT | Q1_TRAVEL | Q2_TRAVEL | Q3_TRAVEL | Q4_TRAVEL |
---------------------------------------------------------------------------------------------------------------------------------------------
| 366 | 109034 | 25418 | 101130 | 54787 | 0 | 0 | 0 | 0 | 1195 | 613 | 1113 | 1195 |