对于这12个月中的每一个月,我都希望创建一个字段,根据当前日期计算最近一个月和最近第二个月的账户级别的销售额。
例如,假设今天的日期是10/6/22,"MostRcentNovember"将总结2021年11月的销售额2ndMostRcentNovember"将总结2020年11月的销售额。一旦当前日期移到2022年11月,此查询将调整为从2022年起提取MostRcentNovember销售额,从2021年起提取2ndMostRcent十一月销售额。
相反,考虑到今天的日期是2022年6月10日,"六月中旬"将总结2022年6月份的销售额,"六月下旬"将总结2021年6月的销售额。
下面是我对这段代码的尝试,我认为这部分实现了,但不确定它是否正是我想要的
SELECT NovemberMostRecent_Value =
sum(case when datepart(year,tran_date) = datepart(year, getdate())
AND DATEPART(month, tran_date) = 11 then value else 0 end)
NovemberSecondMostRecent_Value =
sum(case when datepart(year,tran_date) = datepart(year, getdate())-1
AND DATEPART(month, tran_date) = 11 then value else 0 end)
这是源数据表的一个片段
account_no | trans_date | 值 |
---|---|---|
123 | 21/22 | 500 |
123 | 21年11月1日 | 500 |
123 | 20/20 | <1500>|
123 | 22年6月3日 | 5000 |
123 | 21年4月6日 | 2000 |
456 | 20年3月11日 | 525 |
456 | 21年4月11日 | 125 |
为什么不把过去两年的销售额汇总起来,然后按月份和年份分组?这难道不能解决问题吗?
或者,您可以展示一张表格,其中描述了您正在努力实现的目标。
这应该可以正常工作。注意:我只假设account_no对于所有行都是相同的,如果它们不同,那么您需要将其作为子查询中的一个条件传递。
WITH CTE AS
(SELECT (SELECT SUM(value) FROM tablename WHERE datepart(year, tran_date) = YEAR(getdate()) AND datepart(month, tran_date) = 11)
AS first_value,
(SELECT SUM(value) FROM tablename WHERE datepart(year, tran_date) = YEAR(getdate())-1 AND datepart(month, tran_date) = 11)
AS second_value,
(SELECT SUM(value) FROM tablename WHERE datepart(year, tran_date) = YEAR(getdate())-2 AND datepart(month, tran_date) = 11)
AS third_value)
SELECT IIF (first_value>0, first_value, second_value) AS NovemberMostRecent_Value,
IIF (first_value>0, second_value, third_value) AS NovemberSecondMostRecent_Value FROM CTE;