sql server complex query
第一个是源表,第二个是目标表,所以在第二个表中通过使用 unpivot 将 12 个月的列转换为单列和 YTD 字段应该自动更新。如果月份名称是 Jan 表示 YTD 字段将仅显示 Jan 数据,如果是 Feb 表示它将添加 Jan 数据和 Feb 数据。如果是 12 月,则相同意味着它将从同一行的 1 月添加到 12 月。
使用
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 .... |
你明白了