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的主要内容,如果未能解决你的问题,请参考以下文章