2013-03-25 87 views
-3

您好我是新來的SQL樞轉基礎上多列

我有不同的要求,我需要根據基於對程序分類多列(Q1,Q2,Q3,Q4)以樞軸數據SQL樞紐。請諮詢我如何實現這一目標?

所有例子都基於單個列(如SUM(Q1)FOR類別ID IN([人物],[IT],[旅遊])

我怎麼轉動它基於Q1,Q2, Q3,Q4?

輸入

Input

輸出

Result

回答

2

爲了得到您想要的結果,您將必須同時應用UNPIVOTPIVOT函數。

逆轉置功能將您的Q1Q2Q3Q4列轉換爲行。一旦完成,您將應用支點函數。

的unpivot的代碼將類似於此:

select programid, 
    col + '_'+ category cat_col, 
    value 
from yourtable 
unpivot 
(
    value 
    for col in (Q1, Q2, Q3, Q4) 
) unpiv 

SQL Fiddle with Demo。這給出了一個結果:

| PROGRAMID | CAT_COL | VALUE | 
---------------------------------- 
|  366 | Q1_People | 109034 | 
|  366 | Q2_People | 25418 | 
|  366 | Q3_People | 101130 | 
|  366 | Q4_People | 54787 | 

你可以看到,這個查詢創建了一個新的列名稱來pivot,它具有類別值和季度名稱。

一旦你有了這個結果,您可以將旋轉功能:

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 

SQL Fiddle with Demo。這給出了結果:

| 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 |