如果status
列中的某个值出现,我将筛选出数据库(PostgreSQL(中的行。其思想是,如果唯一的reference
仅具有等于1
的status
,则对amount
列求和。如果查询还具有2
或任何其他status
的状态,则该查询根本不应该SELECT
或reference
。status
表示事务的状态。
当前数据表:
reference | amount | status
1 100 1
2 120 1
2 -120 2
3 200 1
3 -200 2
4 450 1
结果:
amount | status
550 1
我已经简化了数据示例,但我认为它能很好地说明我要找什么。我仅选择状态为1
的references
失败。我尝试过使用HAVING
子句和其他方法进行子查询,但都没有成功。
感谢
这里有一种方法,使用not exists
对状态为1的所有行求和,而不存在具有相同引用和非1状态的其他行。
select sum(amount) from mytable t1
where status = 1
and not exists (
select 1 from mytable t2
where t2.reference = t1.reference
and t2.status <> 1
)
SELECT SUM(amount)
FROM table
WHERE reference NOT IN (
SELECT reference
FROM table
WHERE status<>1
)
子查询选择所有必须排除的reference
,然后主查询对除它们之外的所有内容求和
select sum (amount) as amount
from (
select sum(amount) as amount
from t
group by reference
having not bool_or(status <> 1)
) s;
amount
--------
550
您可以使用windowed functions
来统计每个组状态不同于1的事件:
SELECT SUM(amount) AS amount
FROM (SELECT *,COUNT(*) FILTER(WHERE status<>1) OVER(PARTITION BY reference) cnt
FROM tc) AS sub
WHERE cnt = 0;
Rextenter演示