[英]Aggregating a column based on date dynamically in SQL
這更像是一個概念問題。 我試圖將今年的銷售額與去年的銷售額進行比較。 但是比較應該是動態的,例如,今年我考慮到昨天發生的銷售額,我還需要考慮上一年到去年同一天的銷售額。
例如,今天是 12 月 24 日,所以對於 2021 年,我將銷售額匯總到 12 月 23 日,我也需要在 2020 年也這樣做,即到 2020 年 12 月 23 日。對於明天的報告,匯總應該到 2021 年 12 月 24 日分別為 2020 年 12 月 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 年充滿活力?
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
我自己解決了這個問題,這似乎有效。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.