原始表 , 没有02月
逐月累计 amount ,累计值也缺少02月
如果想补齐02月,达到下面的效果,除了 union 另外一个表的 0 , 还有什么办法
原始表 , 没有02月
逐月累计 amount ,累计值也缺少02月
如果想补齐02月,达到下面的效果,除了 union 另外一个表的 0 , 还有什么办法
参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
为了解决这个问题,可以使用窗口函数与生成日期序列的方法相结合。首先,生成一个包含所有可能月份的日期序列表,然后将原始数据与这个日期序列进行左连接,再使用窗口函数计算累计金额。以下是详细的步骤和SQL代码:
创建一个包含所有可能月份的日期序列表。这里假设我们关注的年份范围是2024年。
左连接原始数据到日期序列表,确保即使某个月份没有数据,也能在结果中显示出来,并且金额为0。
使用窗口函数计算逐月累计金额。
具体SQL代码如下:
-- 假设原始数据表为 original_data
WITH date_sequence AS (
SELECT
2024 AS YEAR,
n + 1 AS MON
FROM
generate_series(0, 11) n -- 生成从0到11的序列,代表每个月份
),
data_with_dates AS (
SELECT
ds.YEAR,
ds.MON,
COALESCE(od.AMOUNT, 0) AS AMOUNT
FROM
date_sequence ds
LEFT JOIN
original_data od ON ds.YEAR = od.YEAR AND ds.MON = od.MON
)
SELECT
YEAR,
MON,
AMOUNT,
SUM(AMOUNT) OVER (PARTITION BY YEAR ORDER BY MON) AS AMOUNT_SUM
FROM
data_with_dates;
这段代码首先创建了一个date_sequence
CTE,其中包含了2024年的所有月份。然后,通过LEFT JOIN
将原始数据表original_data
与date_sequence
连接起来,对于原始数据中缺失的月份,AMOUNT
字段将被填充为0。最后,使用窗口函数SUM(AMOUNT) OVER (PARTITION BY YEAR ORDER BY MON)
计算每个月份的累计金额。
这样处理后,即使原始数据中有缺失的月份,最终的结果也会包括这些月份,并且累计金额会正确地反映出来。