如何计算前一年累计季度销售额

huangapple go评论59阅读模式
英文:

How to calcualte prior Year Cumulative QTD sales

问题

我需要计算去年累计季度销售额。

输入:[![enter image description here][1]][1]

期望输出:[![enter image description here][2]][2]

    ;with Data AS (
        -- 输入数据
        -- ...
    ) 
    SELECT [Year],[quarter],[Date],SalesID,
           SUM(SalesAmt) OVER (PARTITION BY [Year], SalesId ORDER BY [quarter]) AS YTDSales,
           LAG(SalesAmt, 4) OVER (PARTITION BY SalesId ORDER BY [Year]) AS PriorCumulativeQTDSales 
    FROM data a

问题:我无法得到PriorCumulativeQTDSales,请问如何修复我的查询?

注:对于2022年Q1的SalesId(1),PriorCumulativeQTDsales是前一年第1季度的销售额,即45。
对于2022 Q2,PriorCumulativeQTDsales是前一年第1季度销售额与第2季度销售额之和。
对于2022 Q3,PriorCumulativeQTDsales是前一年第1季度销售额与第2季度销售额与第3季度销售额之和。

对于SalesId(2),由于缺少季度数据(2021年第1季度,第2季度和2022年第3季度),PriorCumulativeQTDsales是前一年(2021年)第3季度销售额与第4季度销售额之和,应该在2022年第4季度填充,因为2022年第3季度数据缺失。

[1]: https://i.stack.imgur.com/ON8uj.jpg
[2]: https://i.stack.imgur.com/R4b6r.jpg
英文:

I need to calculate the prior year cumulate QTD sales.

Input:如何计算前一年累计季度销售额

expected output : 如何计算前一年累计季度销售额

;with Data AS (
    select 2021 as [year], 1 as [Quarter] , 1 as SalesID,'1/29/2021' AS Date, 45 AS SalesAmt 
    UNION 
    select 2021 as [year], 2 as [Quarter] , 1 as SalesID,'4/26/2022' AS Date, 100 AS SalesAmt 
    UNION 
    select 2021 as [year], 3 as [Quarter] , 1 as SalesID,'8/29/2021' AS Date, 100 AS SalesAmt 
    UNION 
    select 2021 as [year], 4 as [Quarter] , 1 as SalesID,'11/26/2022' AS Date,50 AS SalesAmt 
    UNION
    select 2022 as [year], 1 as [Quarter] , 1 as SalesID,'1/25/2022' AS Date,100 AS SalesAmt 
    UNION 
    select 2022 as [year], 2 as [Quarter] , 1 as SalesID,'5/22/2022' AS Date,200 AS SalesAmt 
    UNION 
    select 2022 as [year], 3 as [Quarter] , 1 as SalesID,'7/16/2022' AS Date,300 AS SalesAmt 
    UNION 
    select 2022 as [year], 4 as [Quarter] , 1 as SalesID,'12/16/2022' AS Date,400 AS SalesAmt 
    UNION--
    select 2021 as [year], 3 as [Quarter] , 2 as SalesID,'1/26/2021' AS Date, 10 AS SalesAmt 
    UNION 
    select 2021 as [year], 4 as [Quarter] , 2 as SalesID,'12/15/2021' AS Date, 15 AS SalesAmt 
    UNION 
    select 2022 as [year], 1 as [Quarter] , 2 as SalesID,'1/10/2022' AS Date, 20 AS SalesAmt 
    UNION 
    select 2022 as [year], 2 as [Quarter] , 2 as SalesID,'4/10/2022' AS Date, 20 AS SalesAmt 
    UNION 
    select 2022 as [year], 4 as [Quarter] , 2 as SalesID,'10/24/2022' AS Date, 20 AS salesAmt 
    ) 
     select [Year],[quarter],[Date],SalesID 	
    ,SUM(SalesAmt) OVER (Partition by [Year],SalesId order by [quarter]) As YTDSales
     ,LAG(SalesAmt,4) OVER (  Partition by SalesId order by [Year]) As PriorCumulativeQTDSales 
     from  data a

Issue: I am not able to get the PriorCumulativeQTDSales, Any pointers on how to fix my query please ?

Note: For 2022 Q1 for SalesId (1), PriorCumulativeQTDsales is previous year Quarter1 sales which is 45.
For 2022 Q2, PriorCumulativeQTDsales is sum of previous year Quarter1 sales + Quarter 2 sales
For 2022 Q3, PriorCumulativeQTDsales is sum of previous year Quarter1 sales + Quarter 2 + Quarter 3 sales

In case of salesId (2), since quarters are missing (2021 quarter1 , Quarter2 and 2022 quarter3), PriorCumulativeQTDsales is sum of previous year(2021) Quarter 3 sales + Quarter 4 sales and it should be populated in 2022 Quarter 4 as 2022 quarter 3 is missing

答案1

得分: 0

我认为在这种情况下,不使用LAG而是进行自连接会更容易:

SELECT	[Year],[quarter],[Date],SalesID     
,	SUM(SalesAmt) OVER (PARTITION BY [Year],SalesId ORDER BY [quarter]) AS YTDSales
,	ISNULL(priorCumQTDSales, 0) AS PriorCumulativeQTDSales 
FROM	data a
OUTER APPLY (
	SELECT	SUM(SalesAmt) AS priorCumQTDSales
	FROM	data prev
	WHERE	prev.salesID = a.SalesID
	AND	prev.year = a.year -1
	AND	prev.quarter <= a.quarter
) prev

或者如果你更喜欢子查询的话:

SELECT	[Year],[quarter],[Date],SalesID     
,	SUM(SalesAmt) OVER (PARTITION BY [Year],SalesId ORDER BY [quarter]) AS YTDSales
,	ISNULL((
	SELECT	SUM(SalesAmt) AS priorCumQTDSales
	FROM	data prev
	WHERE	prev.salesID = a.SalesID
	AND	prev.year = a.year -1
	AND	prev.quarter <= a.quarter
), 0) AS PriorCumulativeQTDSales 
FROM	data a
英文:

I think in this case it's easier not to use LAG but to do a self join:

SELECT	[Year],[quarter],[Date],SalesID     
,	SUM(SalesAmt) OVER (Partition BY [Year],SalesId ORDER BY [quarter]) AS YTDSales
,	ISNULL(priorCumQTDSales, 0) AS PriorCumulativeQTDSales 
FROM	data a
OUTER APPLY (
	SELECT	sum(SalesAmt) AS priorCumQTDSales
	FROM	data prev
	WHERE	prev.salesID = a.SalesID
	AND	prev.year = a.year -1
	AND	prev.quarter &lt;= a.quarter
) prev

Or a subquery if you swing that way:

SELECT	[Year],[quarter],[Date],SalesID     
,	SUM(SalesAmt) OVER (Partition BY [Year],SalesId ORDER BY [quarter]) AS YTDSales
,	ISNULL((
	SELECT	sum(SalesAmt) AS priorCumQTDSales
	FROM	data prev
	WHERE	prev.salesID = a.SalesID
	AND	prev.year = a.year -1
	AND	prev.quarter &lt;= a.quarter
) , 0) AS PriorCumulativeQTDSales 
FROM	data a

huangapple
  • 本文由 发表于 2023年3月9日 18:20:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/75683252.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定