2012-09-21 35 views
1

如何通過week1,week2,week3..etc來轉換下表。每個月?謝謝。tsql - 如何透視下表?

例如 db表:

enter image description here

這是我所需要的表:

enter image description here

這是我做的,但我需要更有效的方式來做到這一點。

SELECT 'Oct' AS [Month] 
,[Ocd] 
      ,(select Wk_Cmpl from tb1 where WkNum = '1' and RIGHT(wkdt,2) = '10' and Ocd = '167') as wk1 
      ,(select WKLY_PCT from tb1 where WkNum = '1' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as [wk1%] 
      ,(select WE from tb1 where WKNum = '2' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as wk2 
      ,(select WKLY_PCT from tb1 where WkNum = '2' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as [wk2%] 
      ,(select WE from tb1 where WkNum = '3' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as wk3 
      ,(select WKLY_PCT from tb1 where WkNum = '3' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as [wk3%] 
      ,(select WE from tb1 where WkNum = '4' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as wk4 
      ,(select WKLY_PCT from tb1 where WkNum = '4' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as [wk4%] 
      ,(select WE from tb1 where WkNum = '5' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as wk5 
      ,(select WKLY_PCT from tb1 where WkNum = '5' and SUM_LVL_Sort=3.00 and RIGHT(wkdt,2) = '10' and Ocd = '167') as [wk5%] 
      ,[WKLY_AVG]       As [Wk Avg] 
      ,[MTH]        AS [Mo. Cmpl] 
      ,[COMB_FYTD_COMPLT_ALL]    As [M/YTD Total] 
      ,[COMB_FYTD_COMPLT_TARGET_PCT]  As [% Goal] 
FROM tb1 
+0

看起來你已經在Excel中做到了。你問如何在SQL中完全做到這一點?你使用的是什麼RDBMS? –

+0

是的,我試圖在SQL,SSMS 2008中做到這一點,謝謝。 – user1672932

+0

你看過MS BOL中的PIVOT SQL命令嗎?你在SSMS/SQL中已經嘗試過了些什麼? –

回答

3

您將需要使用此UNPIVOTPIVOT。你是不是你如何確定的WklyAvg%Goal清楚,但這應該讓你開始:

select p1.mo, 
    p1.[wkCmpl_1], p1.[wkCmplPct_1], p1.[wkCmpl_2], p1.[wkCmplPct_2], 
    p1.[wkCmpl_3], p1.[wkCmplPct_3], p1.[wkCmpl_4], p1.[wkCmplPct_4], 
    p1.[wkCmpl_5], p1.[wkCmplPct_5], 
    t1.WkAvg, 
    t1.MoCmpl, 
    t2.M_YTD_Total, 
    t1.PctGoal 
from 
(
    select mo, 
    [wkCmpl_1], [wkCmplPct_1], [wkCmpl_2], [wkCmplPct_2], 
    [wkCmpl_3], [wkCmplPct_3], [wkCmpl_4], [wkCmplPct_4], 
    [wkCmpl_5], [wkCmplPct_5] 
    from 
    (
    select datepart(month, wk_endt) mo, 
     value, 
     col + '_' + cast(wkNum as varchar(10)) col 
    from 
    (
     select wk_endt, 
     wkNum, 
     cast(wkCmpl as decimal(10, 2)) wkCmpl, 
     wkCmplPct 
     from yourtable 
    ) x 
    unpivot 
    (
     value 
     for col in (wkCmpl, wkCmplPct) 
    ) u 
) x1 
    pivot 
    (
    max(value) 
    for col in ([wkCmpl_1], [wkCmplPct_1], [wkCmpl_2], [wkCmplPct_2], 
       [wkCmpl_3], [wkCmplPct_3], [wkCmpl_4], [wkCmplPct_4], 
       [wkCmpl_5], [wkCmplPct_5]) 
) p 
) p1 
inner join 
(
    select month(wk_endt) mo, 
    wkcmpl, 
    avg(WkAvg) as WkAvg, 
    MoCmpl, 
    max(M_YTD_Total) M_YTD_Total, 
    PctGoal 
    from yourtable 
    group by month(wk_endt), wkcmpl, MoCmpl, PctGoal 
) t1 
    on p1.mo = t1.mo 
    and p1.wkCmpl_1 = t1.wkcmpl 
inner join 
(
    select month(wk_endt) mo, max(M_YTD_Total) M_YTD_Total, MAX(wknum) wknum 
    from yourtable 
    group by month(wk_endt) 
) t2 
    on t1.mo = t2.mo 

SQL Fiddle with Demo