SQL 使用 ROWS BETWEEN 聚合 12 个月(包括空值)?

问题描述 投票:0回答:1

我目前正在使用包含以下列的表格:

  • 供应商
  • 商品编号
  • 发票_年份_数字
  • 发票_月份_数字
  • 发票日期
  • 发票金额
  • 发票数量

我正在使用

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
sql postgresql
1个回答
0
投票

使用递归 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    */
© www.soinside.com 2019 - 2024. All rights reserved.