提问人:Ronak Vachhani 提问时间:11/11/2023 最后编辑:Ronak Vachhani 更新时间:11/13/2023 访问量:54
SQL Unpivot 滚动日期/周计算
SQL Unpivot Rolling Date/Week Calculation
问:
这是我原来的桌子。它有一个预测发布日期和 6 列,表示 6 周的预测,然后是原始周日期。
Forecast_Release_Date | Adj_Fcst_1 | Adj_Fcst_2 | Adj_Fcst_3 | Adj_Fcst_4 | Adj_Fcst_5 | Adj_Fcst_6 |
---|---|---|---|---|---|---|
03-09-2023 | 299 | 312 | 309 | 248 | 282 | 270 |
预测周 1 = 10-09-2023
预测第 2 周 = 17-09-2023
预测第 3 周 = 24-09-2023
预测第 4 周 = 01-10-2023
预测第 5 周 = 08-10-2023
预测第 6 周 = 15-10-2023
我已经成功地将列取消透视为行。
Forecast_Release_Date | Forecast_Release_Week | Adjusted_Forecast |
---|---|---|
03-09-2023 | 10-09-2023 | 299 |
03-09-2023 | 10-09-2023 | 312 |
03-09-2023 | 10-09-2023 | 309 |
03-09-2023 | 10-09-2023 | 248 |
03-09-2023 | 10-09-2023 | 282 |
03-09-2023 | 10-09-2023 | 270 |
这是我的查询:
SELECT Forecast_Release_Date
,DATEADD(Week, 1, Forecast_Release_Date) AS Forecast_Week
,Adjusted_Forecast
FROM (
SELECT SourceFileInsertDateTime AS Forecast_Release_Date
,Adj_Fcst_1
,Adj_Fcst_2
,Adj_Fcst_3
,Adj_Fcst_4
,Adj_Fcst_5
,Adj_Fcst_6
FROM MyTable
) p
UNPIVOT(Adjusted_Forecast FOR [Week] IN (
Adj_Fcst_1
,Adj_Fcst_2
,Adj_Fcst_3
,Adj_Fcst_4
,Adj_Fcst_5
,Adj_Fcst_6
)) AS unpvt
但我似乎无法获得Forecast_Release_Week列的滚动每周日期,即第一行应该是 10-09,第二行 = 17-09,依此类推。
注意:这必须是基于发布日期列的动态,而不是 硬编码。
我尝试按照 Unpivot 表和计算字段中的代码进行操作,但它给了我相同的结果。
任何帮助都是值得赞赏的。
提前致谢。
P. S. - 我正在使用 Azure Synapse 数据仓库 SQL。
答:
1赞
Adrian Maxwell
11/11/2023
#1
对于不同的 dbms,下面有 2 种变体:
对于 SQL Server(因为问题最初被标记)
还有另一种方法可以在 SQL Server 中使用 和 “取消透视”,这将为值中的每个条目生成一行,您可以根据需要输出任意数量的列。我喜欢按照下面看到的方式布局值,因为它几乎模仿了结果的样子:cross apply
values
SELECT
SourceFileInsertDateTime AS Forecast_Release_Date
, CrossApplied.*
FROM MyTable
CROSS APPLY (
VALUES
(Adj_Fcst_1, dateadd(week,1,SourceFileInsertDateTime))
, (Adj_Fcst_2, dateadd(week,2,SourceFileInsertDateTime))
, (Adj_Fcst_3, dateadd(week,3,SourceFileInsertDateTime))
, (Adj_Fcst_4, dateadd(week,4,SourceFileInsertDateTime))
, (Adj_Fcst_5, dateadd(week,5,SourceFileInsertDateTime))
, (Adj_Fcst_6, dateadd(week,6,SourceFileInsertDateTime))
) AS CrossApplied(Adjusted_Forecast, Forecast_Release_Week)
在 Azure Synapse 数据仓库 SQL 中使用
SELECT
SourceFileInsertDateTime AS Forecast_Release_Date,
Adjusted_Forecast,
Forecast_Release_Week
FROM
(
SELECT Adj_Fcst_1 AS Adjusted_Forecast, dateadd(week,1,SourceFileInsertDateTime) AS Forecast_Release_Week FROM MyTable
UNION ALL
SELECT Adj_Fcst_2, dateadd(week,2,SourceFileInsertDateTime) FROM MyTable
UNION ALL
SELECT Adj_Fcst_3, dateadd(week,3,SourceFileInsertDateTime) FROM MyTable
UNION ALL
SELECT Adj_Fcst_4, dateadd(week,4,SourceFileInsertDateTime) FROM MyTable
UNION ALL
SELECT Adj_Fcst_5, dateadd(week,5,SourceFileInsertDateTime) FROM MyTable
UNION ALL
SELECT Adj_Fcst_6, dateadd(week,6,SourceFileInsertDateTime) FROM MyTable
) AS T
评论
0赞
Adrian Maxwell
11/11/2023
我更改了答案以包括计算日期。它未经测试,可能需要调整。
0赞
siggemannen
11/11/2023
这看起来不错,但我可能只是将:1、2、3、4 留在 Forecast_Release_Week 列中,并在 VALUES 之外执行 DATEADD(week, Forecast_Release_Week, SourceFileInsertDateTime)。避免重复函数调用
0赞
Adrian Maxwell
11/12/2023
要求是使计算是动态的。据推测,行与行不同,因此其他日期也会移动。SourceFileInsertDateTime
1赞
Adrian Maxwell
11/13/2023
那为什么要标记为“sql-server”呢?这也影响了日期的计算方式 - 告诉我们您运行 SQL 的正确环境非常重要......它显然也会影响您,因为现在需要更长的时间才能获得解决方案。
1赞
Adrian Maxwell
11/13/2023
不要包含不相关的标签(即 sql server 如何相关),这只会导致混淆和不必要的延迟,因为来回确定哪个 DBMS 适用。在以后的问题中也请注意这一点。
评论