Oracle Sql: получить сумму группы, если выполнено условие подгруппы - PullRequest
1 голос
/ 19 марта 2019

У меня есть набор данных, по которому я пытаюсь получить суммированное значение для каждой группы, если подгруппа в каждой группе удовлетворяет определенному условию. Я не уверен, возможно ли это, или я неправильно подхожу к этой проблеме.

Мои данные структурированы следующим образом:

+----+-------------+---------+-------+
| ID | Transaction | Product | Value |
+----+-------------+---------+-------+
| 1  |      A      |    0    |   10  |
| 1  |      A      |    1    |   15  |
| 1  |      A      |    2    |   20  |
| 1  |      B      |    1    |   5   |
| 1  |      B      |    2    |   10  | 
+----+-------------+---------+-------+

В этом примере я хочу получить сумму значений с помощью ID column, если транзакция не содержит продуктов с меткой 0. В описанном выше сценарии все значения, связанные с Transaction A, будут исключены, поскольку Product 0 Был куплен. С результатом:

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

Этот процесс будет повторяться для нескольких IDs с каждым идентификатором, содержащим только сумму значений, если транзакция не содержит продукт 0.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Не нужно использовать коррелированный подзапрос с не существует.Просто используйте group by.

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
1 голос
/ 19 марта 2019

Хммм. , , Один из методов - использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...