sql server 复杂查询

sql server complex query

SQL

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


使用 cross apply(values ...) 反透视您的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)

看起来你需要做的是 unpivot,如下所示:

1
2
3
4
5
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


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

1
2
3
4
5
6
7
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 ....

你明白了