【发布时间】:2014-09-03 15:19:43
【问题描述】:
Postgresql 9.1:我有一个查询,只有当两列的 聚合函数 SUM 大于零时,它才必须返回第二个表的值。
这是数据:
表 A
id
---
1
2
3
表 b
id fk(table a)
---------------
1 1
2 null
3 3
表c
id fk(table b) amount price
-----------------------------------
1 1 1 10 --positive
2 1 1 -10 --negative
3 3 2 5
如您所见,table b 有一些来自 table a 的 id,而 table c 可以有 1 个或多个对 的引用>table b, table c 只有当 sum(amount * price) > 0 时才会被检索到。
我写了这个查询:
SELECT
a.id, b.id, SUM(c.amount * c.price) amount
FROM
tablea a
LEFT JOIN
tableb b ON b.fk = a.id
LEFT JOIN
tablec c ON c.fk = b.id
GROUP BY
a.id, b.id
HAVING
SUM(c.amount * c.price) > 0
但是这个查询并没有从 table a 中检索所有行,只是 row 1 并且我需要这两行。我知道这是由于 HAVING 子句而发生的,但我不知道如何重写它。
谢谢。
编辑
预期结果
a b sum
------------------
1 null null -- the sum of 1 * 10 (rows 1 and two) = 0 so its not retrieved.
2 null null -- no foreign key in second table
3 3 10 -- the sum of 2 * 5 (row 3) > 0 so it's ok.
【问题讨论】:
-
你能在 SQL fiddle 中创建这个吗??
-
提供预期结果的示例。
-
对不起我的无知,但是什么是小提琴?
-
你不是按错键加入了吗?连接不应该在
a.id = b.fk等之间吗? -
您的查询缺少
group by。您有一个having子句过滤掉了行,但似乎对此有所抱怨。您说“只有当总和(金额 * 价格)> 0 时才可以检索表 c”,但您不是从table c检索。而且,您的介绍性陈述是“两个字段的总和”,但没有任何字段被求和。请修正问题。期望的结果样本可以帮助您制定您真正想要的结果。
标签: sql left-join postgresql-9.1 psql having