Postgresql - 具有相关子查询的条件 SUM

Posted

技术标签:

【中文标题】Postgresql - 具有相关子查询的条件 SUM【英文标题】:Postgresql - Conditional SUM with correlated subquery 【发布时间】:2017-07-17 23:57:27 【问题描述】:

我想计算 CASE 条件的总和,其中一个条件使用相关子查询来查找结果,但我被语法困住了。

这是我到现在为止创建但有错误的查询示例:

更新

SELECT t1.account,
       t1.date
       SUM(CASE WHEN condition1 THEN t1.amount
                WHEN condition2 THEN (select sum(t2.amount) from t2 where t2.account = t1.account and t2.date = t1.date)
                ELSE 0 END) as total
FROM t1
GROUP BY t1.account, t1.date

当子查询的输出为多条记录时,上述查询返回错误的结果。简而言之,condition2 的结果是 sum(t2.amount) * (记录数)。

我尝试从子查询中删除 sum() 函数,但由于它可以获取多条记录,我仍然遇到错误。

我相信它可以以某种方式完成,但我被卡住了。

谁能给点建议。

顺便说一句,我使用的是 Postgresql 9.4

【问题讨论】:

【参考方案1】:

您可以先进行聚合。如前所述,您的查询似乎正在尝试执行此操作:

SELECT t1.account,
       SUM(CASE WHEN condition1 THEN t1.amount
                WHEN condition2 THEN t2.sumamount
                ELSE 0
           END) as total
FROM t1 LEFT JOIN
     (SELECT t2.account, SUM(t2.amount) as t2.sumamount
      FROM t2
      GROUP BY t2.account
     ) t2
     ON t2.account = t1.account
GROUP BY t1.account

【讨论】:

感谢您的帮助。我已更新查询以更精确地满足我的要求,并描述了查询当前行为的问题。即使使用您的解决方案,我也有相同的结果。我相信这是由于双重聚合,外部 SUM()。有没有其他方法可以避免这种行为? @GiannisDim 由于您无法通过编写查询来表达预期输出,因此您需要将数据样本和预期输出显示为数据。

以上是关于Postgresql - 具有相关子查询的条件 SUM的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:多个存在返回不正确的结果

Laravel 条件子查询与相关模型最后一个条目

Postgresql:FROM 中的子查询必须有别名 - 具有多个连接

postgreSQL - 如何对加入模型结果有条件

PostGreSQL Json数据存储和条件查询

为子查询优化 Postgresql 查询