postgreSQL聚合第二列中具有相同id、特定值的行



如果status列中的某个值出现,我将筛选出数据库(PostgreSQL(中的行。其思想是,如果唯一的reference仅具有等于1status,则对amount列求和。如果查询还具有2或任何其他status的状态,则该查询根本不应该SELECTreferencestatus表示事务的状态。

当前数据表:

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

我已经简化了数据示例,但我认为它能很好地说明我要找什么。我仅选择状态为1references失败。我尝试过使用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演示

相关内容

  • 没有找到相关文章

最新更新