我目前正在使用包含以下列的表格:
我正在使用
SUM(invoice amount)
获取当月的 X.TotalInvoiceSpend
,这需要与过去 12 个月的发票总额进行比较。
我使用
ROWS BETWEEN
来汇总过去 12 个月,但如果一个月没有发票,查询会跳过它并移至过去几年。
关于如何处理这种情况,使其仅在 12 个月内包含 NULL 值,有什么建议吗?示例:对于 2024 年 2 月,基准应来自 2023 年 2 月至 2024 年 1 月,但如果 2023 年 2 月不存在发票,则查询不应移至下一个值。
帮助?
我试过这个
SELECT
x.normalized_supplier_name_inv,
x.item_number,
x.item_description,
x.SiteID, x.country_po,
x.country_inv,
x.Year_Number, x.Month_Number,
SUM(x.TotalInvoiceSpend) OVER(PARTITION BY X.normalized_supplier_name_inv, X.item_number,X.SiteID
ORDER BY x.normalized_supplier_name_inv, x.item_number, x.SiteID, x.Year_Number, x.Month_Number
ROWS BETWEEN 12 PRECEDING AND 1 PRECEDING) AS BaselineSpend,
X.TotalInvoiceSpend
FROM
(SELECT
cp.normalized_supplier_name_inv,
cp.item_number,
cp.item_description,
cp.location_inv as SiteID,
CAST(cp.inv_date_year_numerical AS INTEGER) AS Year_Number,
CAST(cp.inv_date_month_numerical AS INTEGER) AS Month_Number,
SUM(cp.invoice_spend_usd) AS TotalInvoiceSpend,
SUM(cp.invoice_quantity) AS TotalInvcdQty
FROM
invoice_flat AS cp) X
使用递归 cte 生成感兴趣期间的月份日历。将表数据左连接到日历 a 并处理没有发票的月份的空值。加入日期被截断为月份。
WITH -- recursive cte generating months for period of interest
Recursive
cal ( m_id, a_month) AS
( Select 1 as m_id, Date_Trunc('month', '2023-01-01'::Date) as a_month
UNION ALL
Select m_id + 1, a_month + interval '1 month'
From cal
Where a_month < Date_Trunc('month', Current_Date)
)
Select * From cal;
/*
m_id a_month
---- --------------------
1 2023-01-01 00:00:00+00
2 2023-02-01 00:00:00+00
3 2023-03-01 00:00:00+00
4 2023-04-01 00:00:00+00
5 2023-05-01 00:00:00+00
6 2023-06-01 00:00:00+00
7 2023-07-01 00:00:00+00
8 2023-08-01 00:00:00+00
9 2023-09-01 00:00:00+00
10 2023-10-01 00:00:00+00
11 2023-11-01 00:00:00+00
12 2023-12-01 00:00:00+00
13 2024-01-01 00:00:00+00
14 2024-02-01 00:00:00+00
15 2024-03-01 00:00:00+00
16 2024-04-01 00:00:00+00
17 2024-05-01 00:00:00+00
18 2024-06-01 00:00:00+00
19 2024-07-01 00:00:00+00 */