2015-09-06 92 views
1

我正在使用T-SQL,並且當前有一個列轉換,我試圖將其轉換爲多列轉換。我的當前SQL如下:如何將T-SQL單列unpivot語句轉換爲多列unpivot語句

T_Code  Type  P_Value 
123   P_1  1 
123   LA_1  2 
123   LB_1  2 
...   ...  -- 

SELECT T_CODE, TYPE, P_VALUE 
    FROM POC s 
    unpivot 
    (P_VALUE 
    FOR TYPE IN (P_1, P_2, P_3, P_4, P_5, P_6, LA_1, LA_2, LA_3, LA_4, LA_5, LA_6, LB_1, LB_2, LB_3, LB_4, LB_5, LB_6)) u 

這產生了表具有以下結構,其中類型列可以包括18個值P_1-P_6,LA_1-LA_6和LB_1-LB_6之一我想什麼做的,但是是有以下結構的表:

T_Code  P  LA LB 
123  1  2 2 

當我研究這個網上,我碰到這個偉大Zen SQL blog post,我認爲來到省爲我提供了一個可行的解決方案,但我無法完成它的工作。

我的數據結構與示例有點不同,因爲我的類型列包含三種不同類型的數據,所以這是我認爲可能的工作。不幸的是,事實並非如此。任何人都可以指向正確的方向。

SELECT R_DATE, TYPE, P_VALUE 
     FROM POC s 
     unpivot 
     (P_VALUE 
     FOR TYPE IN (P_1, P_2, P_3, P_4, P_5, P_6)) u1 
     unpivot 
     (P_VALUE 
     FOR TYPE IN (LA_1, LA_2, LA_3, LA_4, LA_5, LA_6)) u2 
     unpivot 
     (P_VALUE 
     FOR TYPE IN (LA_6, LB_1, LB_2, LB_3, LB_4, LB_5, LB_6)) u3 

下面是一些樣本數據:

T_Code  Type  P_Value 
123  P_1  1 
123  P_2  4 
123  P_3  1 
123  P_4  2 
123  P_5  5 
123  P_6  1 
123  LA_1  1 
123  LA_2  2 
123  LA_3  1 
123  LA_4  6 
123  LA_5  1 
123  LA_6  5 
123  LB_1  1 
123  LB_2  1 
123  LB_3  1 
123  LB_4  4 
123  LB_5  9 
123  LB_6  1 
+2

準備http://sqlfiddle.com中的初始結構和數據 – lad2025

+1

您可以發佈'POC'表的樣本數據嗎? SQL小提琴也很適合排除故障。 –

+1

你也在你的select語句中顯示R_DATE,但你的輸出顯示T_CODE。這兩個字段是相同還是在你的SQL不完整? –

回答

0

它更容易使用的情況下表達:

select 
    T_CODE, 
    sum(case when Type like 'P_%' then P_VALUE else null end) as P, 
    sum(case when Type like 'LA_%' then P_VALUE else null end) as LA, 
    sum(case when Type like 'LB_%' then P_VALUE else null end) as LB 
from POC 
group by T_CODE; 

如果你真的覺得有必要使用旋轉操作,我想你想要pivot而不是unpivot

select T_CODE, [P], [LA], [LB] 
from 
    (
     select T_CODE, substring(TYPE, 1, charindex('_', TYPE) - 1) as BUCKET, P_VALUE 
     from POC 
    ) as data 
    pivot 
    (
     sum(P_VALUE) 
     for BUCKET IN ([P], [LA], [LB]) 
    ) as pvt; 

SQL Fiddle