![](/img/trans.png)
[英]SQL Server : excluding rows from a table IF there is another row with the same col value and a particular secondary column value
[英]SQL aggregate rows with same id , specific value in secondary column
如果status
列中的值之一发生,我想过滤数据库(PostgreSQL)中的行。 想法是,如果唯一reference
的status
仅等于1
则对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
子句和其他方法的子查询,但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
s,然后主查询将除它们之外的所有内容相加
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.