2012-10-19 101 views
0

假設我有一個臨時表創建和結構/數據看起來像這樣SQL樞軸旋轉柱

Type  Lang N_cnt  Pcnt  T1  T2  T3  T4 
============================================================================ 
ClassroomA  1  165897  1232  6439 1135  4516  1756 
ClassroomA  2  175127  1254  6439 1135  1285  1953 
ClassroomB  1  179515  1284  6439 1762  3945  1957 
ClassroomB  2  159683  2041  6439 1575  4745  1955 

我想樞軸T1T2T3T4列,我得到這樣的結果

Type  SubType Lang  N_cnt   P_cnt 
============================================================== 
ClassroomA  NULL  1  165897   1232 
NULL   "T1"  1 6439/165897  6439/1232  
NULL   "T2"  1  *calculation* *calculation* 
NULL   "T3"  1  *calculation* *calculation* 
NULL   "T4"  1  *calculation* *calculation* 
ClassroomA  NULL  2  175127   1254 
NULL   "T1"  2  6439/175127  6439/1254  
NULL   "T2"  2  *calculation* *calculation* 
NULL   "T3"  2  *calculation* *calculation* 
NULL   "T4"  2  *calculation* *calculation* 

請注意,它說什麼calculation這就是我將採取T{x}的價值和做一些與它的解釋(我做了第一個的例子0)。我還想補充一點,實際上我對這些變量有大約十個。

任何想法如何旋轉列?

回答

3

您可以使用類似這樣:

select type, 
    case when subtype = 'start' then null else subtype end subtype, 
    lang, 
    case when subtype = 'start' then n_cnt else value/(n_cnt * 1.0) end n_cnt, 
    case when subtype = 'start' then pcnt else value/(pcnt * 1.0) end pcnt 
from 
(
    select type, lang, n_cnt, pcnt, 
    T1, T2, T3, T4, 0 as start 
    from table1 
) x 
unpivot 
(
    value 
    for subtype in (T1, T2, T3, T4, start) 
) un 
order by type, lang, subtype; 

SQL Fiddle with Demo

+0

棒極了感謝,但是我的表結構較爲複雜,則例如我給,我真的不理解查詢了一下。不過,我正在修改它以使其適用於我。我將它標記爲正確的答案在一點THANKs :) – masfenix

+0

可以說我想要兩套支點。它,我有T列和P列,我想並排顯示它們。我編輯了架構以在發送的鏈接中包含這些列 http://sqlfiddle.com/#!3/62862/2/0但我不知道如何編輯代碼 – masfenix

+1

檢查值= 0「在第二個和第三個CASE中可能是不可靠的。如果'T1','T2'等中的任何一個變成'0'會怎麼樣?我認爲使用與第一個CASE相同的條件會更安全('subtype ='start'')。除此之外,我非常喜歡這種方法! –