如何解决SQL获取四分之一季度值
我想从具有第3季度和第4季度数据的数据集获得QoQ,该数据集还具有报告日期列,每行每个财政月应具有QoQ值(以报告日期表示),第4季度应与第3季度进行比较但我的发言似乎只是在同一季度内进行比较,即Q4与Q4进行了比较,而不是Q4与Q3进行了比较。.
我正在使用lag
函数,但是不确定是否有人在看下面的代码,这是我做错了。
SELECT [Year],[SalesDate] as Report_Date,[Quarter],Sales,LAG(Sales,1,0) OVER(
PARTITION BY [Year],[Quarter]
ORDER BY [Year],salesDate
ASC) AS [QuarterSales_Offset],sales - LAG(Sales) OVER(
PARTITION BY [Year],salesDate
ASC) as diff,Case When
LAG(Sales,salesDate
ASC) = 0 then null else
(
sales - LAG(Sales,salesDate
ASC))/ LAG(Sales,salesDate
ASC) end as QoQ
FROM dbo.ProductSales_2;
解决方法
由于block
以1个偏移量返回了上一行,并且您的数据处于月级水平,因此实际上您在每个季度中逐月比较。考虑一种不同的方法,例如按季度和按季度连接数据的两个子集。
LAG()
列可以使用QuarterMonth
表达式进行计算(即,每个季度的连续月份计数)。由于销售数据可能会出现月份差异,因此请使用与您的会计年度对齐的ROW_NUMBER()
日历表。总之,这允许按列比较第一季度第四季度(year_quarter_month
)与第一季度第三季度(2020-08-31
)。
2020-05-31
您也许可以推广到任何季度计算,而不仅仅是第三季度和第四季度:
WITH unit AS (
SELECT yqm.[Year],yqm.[Quarter],yqm.[Month],COALESCE(p.[Report_Date],DATEADD(DAY,-1,DATEFROMPARTS(yqm.[Year],yqm.[Month]+1,1))) AS [Report_Date],p.[Sales]
FROM year_quarter_month_table yqm
LEFT JOIN dbo.ProductSales_2 p
ON yq.[Year] = p.[Year]
AND yq.[Quarter] = p.[Quarter]
AND yq.[Month] = p.[Month]
),sub AS (
SELECT [Year],[Quarter],[Month],ROW_NUMBER() OVER(PARTITION BY [Year],[Quarter]
ORDER BY [Report_Date]) AS [QuarterMonth],[Report_Date],[Sales]
FROM unit
)
SELECT q4.[Year],q4.[Report_Date] AS Q4_Date,q4.[Sales] AS Q4_Sales,q3.[Report_Date] AS Q3_Date,q3.[Sales] AS Q3_Sales,q4.[Sales] - q3.[Sales] AS Diff,COALESCE((q4.[Sales] - q3.[Sales]) / q3.[Sales],0) AS QoQ
FROM sub q4
LEFT JOIN sub q3
ON q4.[Year] = q3.[Year]
AND q4.[Quarter] = 4
AND q3.[Quarter] = 3
AND q4.[QuarterMonth] = q3.[QuarterMonth]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。