在 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 中根据日期动态聚合列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eloquent 的日期时间列的时间上使用聚合函数?