在 SQL 中根据日期动态聚合列

Posted

技术标签:

【中文标题】在 SQL 中根据日期动态聚合列【英文标题】:Aggregating a column based on date dynamically in SQL 【发布时间】:2021-12-24 12:41:03 【问题描述】:

这更像是一个概念性问题。我正在尝试将今年的销售额与去年进行比较。但是比较应该是动态的,例如,今年我考虑到昨天发生的销售额,我还需要考虑上一年到去年同一日期的销售额。

例如,今天是 12 月 24 日,因此对于 2021 年,我将销售额汇总到 12 月 23 日,我也需要对 2020 年进行相同的操作,即到 2020 年 12 月 23 日。对于明天的报告,汇总应该到 12 月分别为 2021 年 24 月和 2020 年 12 月 24 日。

到目前为止我的代码:

SELECT product_category,
       SUM(CASE WHEN purchase_date >= '2021-01-01' AND purchase_date < CURRENT_DATE THEN sales_revenue ELSE 0 END) AS revenue_2021,
       SUM(CASE WHEN purchase_date >= '2020-01-01' AND purchase_date < '2021-01-01' THEN sales_revenue ELSE 0 END) AS revenue_2020
FROM sales_table
GROUP BY 1
ORDER BY 1
       

在这里,我的代码在 2021 年有效。但对于 2020 年,它将给出全年(2020 年)的总和。无论如何,我是否可以像 2021 年一样让 2020 年充满活力?

【问题讨论】:

【参考方案1】:
SELECT product_category,
       SUM(CASE WHEN purchase_date >= DATEADD(yy, DATEDIFF(yy, 0, CURRENT_DATE), 0)

 AND purchase_date < CURRENT_DATE THEN sales_revenue ELSE 0 END) AS revenue_2021,
       SUM(CASE WHEN purchase_date >= DATEADD(yy, DATEDIFF(yy, 0, CURRENT_DATE)-1, 0) AND purchase_date < dateadd(yy, -1, CURRENT_DATE) THEN sales_revenue ELSE 0 END) AS revenue_2020
FROM sales_table
WHERE
purchase_date >= DATEADD(yy, DATEDIFF(yy, 0, CURRENT_DATE)-1, 0)
GROUP BY 1
ORDER BY 1
      

【讨论】:

谢谢。也应该试试这个。【参考方案2】:

我自己解决了这个问题,这似乎可行。

SELECT EXTRACT(YEAR FROM DATE_TRUNC('YEAR',purchase_date) AS Year,
product_category,
SUM(sales_revenue)
FROM sales_table
WHERE DATE_PART('MONTH',purchase_date)*100 + DATE_PART('DAY',purchase_date_time)
< DATE_PART('MONTH',CURRENT_DATE)*100 + DATE_PART('DAY',CURRENT_DATE)
GROUP BY 1,2
ORDER BY 1,2

【讨论】:

以上是关于在 SQL 中根据日期动态聚合列的主要内容,如果未能解决你的问题,请参考以下文章

Linq to sql,聚合列,按日期分组到列表视图

如何在 Eloquent 的日期时间列的时间上使用聚合函数?

用于列的 Oracle 动态 SQL

Python Pandas:将日期时间列分组为小时和分钟聚合

在 SELECT 查询 SQL 中生成动态日期列

数据库开发基础-SQl Server 聚合函数数学函数字符串函数时间日期函数