AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 265713
Accepted
Nick Buxton
Nick Buxton
Asked: 2020-04-24 11:46:49 +0800 CST2020-04-24 11:46:49 +0800 CST 2020-04-24 11:46:49 +0800 CST

如何加入时间戳并包含 NULL 条目?

  • 772

我正在尝试查询以将每日会计发票的总和与每日预算进行比较。预算存储为一个月的一个值,因此我将该金额除以总天数,因为 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

我愿意接受其他查询想法来实现这一点。感谢您的帮助!

union datetime
  • 1 1 个回答
  • 264 Views

1 个回答

  • Voted
  1. Best Answer
    Nick Buxton
    2020-04-25T14:02:11+08:002020-04-25T14:02:11+08:00

    我已经设法做到了这一点,方法是从主查询中完全删除连接并创建一个 CASE WHEN 子查询,如果匹配则首先查看,否则分配 0。然后,对符合条件的发票进行汇总。

    如果有比我现在下面的查询更好的方法来处理这个问题,请告诉我。由于我正在使用 CASE WHEN 和其中的子查询,因此我认为这部分可以以某种方式更好地简化。但是,如果它有效,它就有效并且看起来并不昂贵。

    另外,请注意:上面我错误地引用了a.account_id第 18 行(倒数第二个)。当我将在我的情况下使用的确切表修改为更简单的集合以理解所使用的 SQL 时,就会发生这种情况。确保我的会计表表示中的字段:

    a.account_id= 代表会计科目表的
    a.invoice_idID = 代表发票上销售组的 ID(上面的错误a.account_id是 20,应改为a.invoice_id= 20)
    a.credit= 双账会计贷项
    a.debit= 双账会计借方

    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",
    SUM ( CASE WHEN
    ( SELECT a.date FROM accounting a
    LEFT JOIN t ON date_part('day',a.date) = t.days
    WHERE a.date >= '2020-04-01'
    AND a.date <= '2020-04-30'
    AND a.invoice_id = 20
    LIMIT 1) IS NULL
    THEN 0 ELSE
    ( SELECT SUM
    ( CASE WHEN a.account_id IN (17,43,44)
    THEN a.credit - a.debit ELSE 0 END)
    FROM accounting a
    WHERE date_part('day',a.date) = t.days
    AND a.date >= '2020-04-01'
    AND a.date <= '2020-04-30'
    AND a.invoice_id = 20)
    END ) AS "Invoices",
    t.budget AS "Budget"
    FROM t
    GROUP BY 1,3
    ORDER BY 1;

    我感谢那些看过这个查询并考虑解决它的方法的人。

    • 0

相关问题

  • 无法在 SQL Server 上并行运行联合

  • 如何计算在单个列中花费的时间?

  • 如何使用从第一个查询中选择值执行两个简单查询

  • MySQL - SELECT INTO OUTFILE,带有 UNION

  • 列联合

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve