【问题标题】:PostgreSQL sum some values together and don't for otherPostgreSQL 将一些值加在一起,而不是其他值
【发布时间】:2022-01-27 03:07:32
【问题描述】:
SELECT
    t.id,
    sum(o.amount),
    t.parent_id
FROM tab t
         LEFT JOIN order o ON o.deal = t.id
GROUP BY t.id

当前输出:

id sum parent_id
1 10
2 10
3 15 5
4 30 5
5 0
6 0 8
7 0 8
8 20

所需的逻辑,如果该行包含 parent_id 则跳过它,但将所有内容添加到 sum 字段中,因此对于 id 3、4、5,总数将为 45,并且仅显示 id 5。在某些情况下,总和位于“子选项卡”或“主选项卡”中,但所有内容都应加在一起。 期望的输出:

id sum parent_id
1 10
2 10
5 45
8 20

到目前为止,我尝试过的是进行子选择并使用 group by。有人能指出我正确的方向吗?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    使用 coalesce()。

    with the_data(id, sum, parent_id) as (
    values
        (1, 10, null),
        (2, 10, null),
        (3, 15, 5),
        (4, 30, 5),
        (5, 0, null),
        (6, 0, 8),
        (7, 0, 8),
        (8, 20, null)
    )
    
    select coalesce(parent_id, id) as id, sum(sum)
    from the_data
    group by 1
    order by 1
    

    阅读功能in the documentation.

    Db<>fiddle.

    【讨论】:

      【解决方案2】:

      您的查询在 PostgreSQL 中无效:

      SELECT
          t.id,
          sum(o.amount),
          t.parent_id
      FROM tab t
               LEFT JOIN order o ON o.deal = t.id
      GROUP BY t.id
      

      与 MySQL 不同,PostgreSQL 没有隐式 GROUP BY 列(除非最近发生了变化)。

      无论如何,如果您在 GROUP BY 子句中使用 t.id,那么每个 t.id 将产生一行,因此您将始终将 3 和 4 分开。

      您似乎正在尝试使用 parent_id 作为主要分组标准,当 parent_idNULL 时,您将退回到 id

      您可以使用COALESCE(t.parent_id, t.id) 获取每一行的此值,然后使用它进行分组。

      例如:

      SELECT
          COALESCE(t.parent_id, t.id),
          SUM(o.amount)
      FROM tab t
               LEFT JOIN order o ON o.deal = t.id
      GROUP BY COALESCE(t.parent_id, t.id)
      

      【讨论】:

      • SELECT COALESCE(t.parent_id, t.id), SUM(o.amount), t.timestamp FROM tab t LEFT JOIN order o ON o.deal = t.id GROUP BY COALESCE(t .parent_id, t.id), t.timestamp 如果还有一个时间戳然后将它们分开,因为需要将其放入组中
      • 我可以只取主标签的时间戳吗?
      猜你喜欢
      • 2019-04-26
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多