Oracle Sql:如果满足子组条件,则获取组的和

Oracle Sql:如果满足子组条件,则获取组的和,sql,oracle,Sql,Oracle,我有一个数据集,如果每个组中的一个子组满足某个条件,我将尝试为每个组输入一个求和值。我不确定这是否可行,或者我是否错误地处理了这个问题 我的数据结构如下: +----+-------------+---------+-------+ | ID | Transaction | Product | Value | +----+-------------+---------+-------+ | 1 | A | 0 | 10 | | 1 | A

我有一个数据集,如果每个组中的一个子组满足某个条件,我将尝试为每个组输入一个求和值。我不确定这是否可行,或者我是否错误地处理了这个问题

我的数据结构如下:

+----+-------------+---------+-------+
| ID | Transaction | Product | Value |
+----+-------------+---------+-------+
| 1  |      A      |    0    |   10  |
| 1  |      A      |    1    |   15  |
| 1  |      A      |    2    |   20  |
| 1  |      B      |    1    |   5   |
| 1  |      B      |    2    |   10  | 
+----+-------------+---------+-------+
在本例中,如果事务不包含任何标记为0的产品,我希望通过
ID列
获取值的总和。在上述场景中,与
事务A
相关的所有值都将被排除,因为购买了
产品0
。其结果是:

+----+-------------+
| ID | Sum of Value|
+----+-------------+
| 1  |      15     |  
+----+-------------+

如果事务不包含产品0,则此过程将对多个
ID重复,每个ID仅包含值的总和。

Hmmm。一种方法是使用
notexists
进行过滤:

select id, sum(value)
from t
where not exists (select 1
                  from t t2
                  where t2.id = t.id and t2.transaction = t.transaction and
                        t2.product = 0
                 )
group by id;

不需要使用不存在的相关子查询。 只需使用分组方式

with s (id, transaction, product, value) as (
select 1, 'A', 0, 10 from dual union all
select 1, 'A', 1, 15 from dual union all
select 1, 'A', 2, 20 from dual union all
select 1, 'B', 1, 5  from dual union all
select 1, 'B', 2, 10 from dual)
select id, sum(sum_value) as sum_value
from
   (select id, transaction,
    sum(value) as sum_value
    from s
    group by id, transaction
    having count(decode(product, 0, 1)) = 0
   )
group by id;

        ID  SUM_VALUE
---------- ----------
         1         15

哇,谢谢你的快速回复。让我试试看,然后再给你回复。这太完美了,果然奏效!!非常感谢你!现在,我开始理解问题的过程。您的问题用oracle和tsql标记。你用哪一种?TSQL是一种专有的Microsoft过程语言。Oracle是使用PL/SQL过程语言的数据库管理系统(DBMS)。正确的标签将帮助我们准确地回答。很抱歉,只有Oracle。我一定是选错了tsql而不是plsql@VesperAnnstas从技术上讲,Sybase(非MS产品)也使用TSQL作为Sybase,MSSQL共享历史。