sql server复杂查询

时间:2017-06-08 12:31:23

标签: sql sql-server sql-server-2008 sql-server-2012

SQL SERVER

第一个是源表,第二个是目标表,因此在第二个表中使用unpivot将12个月的列转换为单列,YTD字段应自动更新。如果月份名称为Jan,则表示YTD字段仅为Jan数据,如果为2月,则表示将使用Feb数据添加Jan数据。如果它是Dec则表示它将从同一行的Jan到Dec添加。

3 个答案:

答案 0 :(得分:1)

使用cross apply(values ...)取消对数据的取消投放:

select 
    t.[oru code]
  , t.[bg name]
  , t.[bu name]
  , t.[domain]
  , t.KPI
  , t.UoM
  , t.[Year]
  , t.[ACT/TARGET]
  , v.[Month]
  , v.KPI
  , t.[YTD/ITM]
from t
  cross apply (values 
    ('Jan',Jan) ,('Feb',Feb) ,('Mar',Mar)
   ,('April',April) ,('May',May) ,('Jun',Jun)
   ,('Jul',Jul) ,('Aug',Aug) ,('Sep',Sep)
   ,('Oct',Oct) ,('Nov',Nov) ,('Dec',Dec)
    ) v ([Month],KPI)

答案 1 :(得分:0)

只需选择所有月份,然后选择UNION:

select [ORU code], [BG Name], YEAR, 'Jan' as [Month], [Jan] as [KPI #], [Jan] 
as [YTD/ITM] from  source_table 
union all
select [ORU code], [BG Name], YEAR, 'Feb' as [Month], [Feb] as [KPI #], [Jan]+
[Feb]  as [YTD/ITM] from  source_table 
union all
select ....

你得到了想法

答案 2 :(得分:0)

看起来你需要的是如下所示进行拆卸:

Select *, [YTD] = sum(yourYTD calculation column) over(partition by [OruCode],[year] order by Month) from (
   Select OruCode, BGName ---your required columns upto dec
       from table1 t1 cross join table2 t2
 )
 unpivot (KPINo for [Month] in ([Jan],[Feb]...) ) p