tsql - 如何透过下表?

时间:2012-09-21 22:17:24

标签: sql sql-server tsql pivot

如何按周1,周2,周3 ...等旋转下表。每个月?感谢。

例如,

db table:

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

1 个答案:

答案 0 :(得分: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