繁体   English   中英

SQL聚合具有相同id的行,辅助列中具有特定值

[英]SQL aggregate rows with same id , specific value in secondary column

如果status列中的值之一发生,我想过滤数据库(PostgreSQL)中的行。 想法是,如果唯一referencestatus仅等于1则对amount列求和。 如果查询的状态也为2或与此相关的任何其他status ,则查询根本不应SELECTreference 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;

Rextester演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM