我有一个数据集,如果每个组中的一个子组都满足特定条件,我将在该数据集上尝试为每个组求和。我不确定这是否可行,或者我是否正确地解决了这个问题。
我的数据结构如下:
+----+-------------+---------+-------+
| 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 column
获取值的总和。在上述情况下,与Transaction A
相关的所有值都将为排除,因为购买了Product 0
。结果是:
+----+-------------+
| ID | Sum of Value|
+----+-------------+
| 1 | 15 |
+----+-------------+
如果交易不包含乘积0,此过程将重复多个IDs
,每个ID仅包含值的总和。
答案 0 :(得分:1)
嗯。 。 。一种方法是使用not exists
进行过滤:
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;
答案 1 :(得分:1)
不需要使用不存在的相关子查询。 只需使用分组依据即可。
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