查询根据列对多行求和

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

我有一个表格,其中包含每个 ID 的每月金额,其中某些月份会开具发票。

我的桌子看起来像:

身份证 日期 已开发票 金额
AAA 2023-01 0 10
AAA 2023-02 0 15
AAA 2023-03 1 15
AAA 2023-04 0 10
AAA 2023-05 0 10
AAA 2023-06 1 10
BBB 2022-05 0 40
BBB 2022-06 1 20
BBB 2022-07 0 30
BBB 2022-08 1 30

我只需要每个 ID 的行和发票月份,其中我们将自上次发票以来的先前金额相加。 我想要拥有什么:

身份证 日期 已开发票 金额
AAA 2023-03 1 40
AAA 2023-06 1 30
BBB 2022-06 1 60
BBB 2022-08 1 60

如何在 postgresql 中完成此操作?我从下面的查询开始,但它还没有给出我需要的内容。

SELECT "ID", "Date", "Invoiced"
      , sum(Amount) OVER (PARTITION BY "Invoiced" ORDER BY "Id", "Date") AS Amount
FROM   Table
sql postgresql
1个回答
0
投票

我们可以使用

LAG()
SUM()
的组合作为窗口函数,为每个发票周期、每个
ID
创建一个伪组:

WITH cte1 AS (
    SELECT *, LAG(Invoiced) OVER (PARTITION BY ID ORDER BY Date) LagInvoiced
    FROM yourTable
),
cte2 AS (
    SELECT *, SUM(LagInvoiced) OVER (PARTITION BY ID ORDER BY Date) grp
    FROM cte1
)

SELECT
    ID,
    MAX(CASE WHEN Invoiced = 1 THEN Date END) AS InvDate,
    1 AS Invoiced,
    SUM(Amount)
FROM cte2
GROUP BY
    ID,
    grp
ORDER BY
    ID,
    InvDate;
© www.soinside.com 2019 - 2024. All rights reserved.