我正在尝试查询以将每日会计发票的总和与每日预算进行比较。预算存储为一个月的一个值,因此我将该金额除以总天数,因为 4 月份将有 30 个条目。
但是,即使当天没有发票,我也希望这些天的预算金额永久存在,无论是当天还是实际上当天。
我当前的查询加入了时间戳的 date_part('day',a.date) ,该时间戳仅在当天有发票时才会出现。我正在使用 PostgreSQL 版本 11.3。我已经尝试了所有加入的可能性,并且每次都得到相同的结果。除非我使用 CROSS JOIN,它确实给出了所有 30 天,但每天所有发票的总和。我曾认为 FULL OUTER JOIN 会起作用,或者以其他方式使用 UNION ALL,但到目前为止我还没有成功。
WITH RECURSIVE t(days,budget) AS (
SELECT 1 as days,b.amount/30 AS budget
FROM budgets b
WHERE b.id = 10
UNION ALL
SELECT t.days + 1,t.budget
FROM t WHERE t.days < 30)
SELECT
t.days AS "Day",
COALESCE ( SUM ( CASE WHEN a.account_id IN (17,43,44)
THEN a.credit - a.debit ELSE 0 END),0) AS "Invoices",
t.budget AS "Budget"
FROM t
LEFT JOIN accounting a
ON date_part('day',a.date) = t.days
WHERE a.date >= '2020-04-01'
AND a.date <= '2020-04-30'
AND a.account_id = 20
GROUP BY 1,3;
对于输出,假设第 1 天、第 2 天和第 3 天已经过去,而第 2 天没有条目。
当前产出
日发票预算
1 100 50
3 75 50
期望产出
日发票预算
1 100 50
2 0 50
3 75 50
4 0 50
5 0 50
...
30 0 50
我愿意接受其他查询想法来实现这一点。感谢您的帮助!