【问题标题】:sql server complex querysql server 复杂查询
【发布时间】:2017-06-08 12:31:23
【问题描述】:

第一个是源表,第二个是目标表,所以在第二个表中通过使用 unpivot 将 12 个月的列转换为单列和 YTD 字段应该自动更新。如果月份名称是 Jan 表示 YTD 字段将仅显示 Jan 数据,如果是 Feb 表示它将添加 Jan 数据和 Feb 数据。如果是 12 月,则相同意味着它将从同一行的 1 月到 12 月相加。

【问题讨论】:

  • 最好提供这些输入数据的文本,而不是图像
  • 你尝试过什么,你的问题是什么?
  • 对不起...我想不出这种要求的任何逻辑。这就是我在 staskoverflow 中发布它的原因。

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


【解决方案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)

【讨论】:

    【解决方案2】:

    只需单独选择所有月份,然后将它们联合起来:

    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 ....
    

    你明白了

    【讨论】:

      【解决方案3】:

      看起来你需要做如下反透视:

      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 
      

      【讨论】:

      • 在 Unpivot 之后,我需要根据月份值更新 YTD 字段。表示累计和。
      • 我的意思是如果月份名称是 jan,它将更新 YTD 列中的 jan 月份值,如果它是 feb,则 YTD 列将更新 Jan 值 + feb 值,就像它一样比 YTD=jan+feb+mar+apr+may 是 5 月
      • 是的,这就是我的查询要做的事情
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多