2015-11-09 5 views
1

Моей таблицы:Oracle SQL группируя один столбец на основе другого столбца значения

con_ref  col_ref sal 
    1   NON  25 
    1   COL  36 
    1   COL  12 
    1   NON  13 
    2   NON  25 
    2   NON  6 
    2   NON  33 
    3   COL  42 
    3   NON  51 
    4   NON  63 
    4   NON  31 
    4   NON  15 

Я хочу, чтобы сгруппировать выше данных о Con_ref колонки, где col_ref значение просто «NON». поэтому, если col_ref имеет как «NON», так и «COL», это должно исключать.

Желаемая Выход:

CON_REF sum(SAL) 
2   64 
4   109 

ответ

1

Что-то вроде этого:

with sample_data as (select 1 con_ref, 'NON' col_ref, 25 sal from dual union all 
        select 1 con_ref, 'COL' col_ref, 36 sal from dual union all 
        select 1 con_ref, 'COL' col_ref, 12 sal from dual union all 
        select 1 con_ref, 'NON' col_ref, 16 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 25 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 6 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 33 sal from dual union all 
        select 3 con_ref, 'COL' col_ref, 42 sal from dual union all 
        select 3 con_ref, 'NON' col_ref, 51 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 63 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 31 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 15 sal from dual) 
-- end of mimicking a table called sample_data with data in it 
select con_ref, 
     sum(sal) 
from sample_data 
group by con_ref 
having count(case when col_ref != 'NON' then 1 end) = 0; 

    CON_REF SUM(SAL) 
---------- ---------- 
     2   64 
     4  109 

ETA: Тот же результат по запросу без использования GROUP BY (NB это для Oracle, я понятия не имею ли он будет работать на других платформах):

with sample_data as (select 1 con_ref, 'NON' col_ref, 25 sal from dual union all 
        select 1 con_ref, 'COL' col_ref, 36 sal from dual union all 
        select 1 con_ref, 'COL' col_ref, 12 sal from dual union all 
        select 1 con_ref, 'NON' col_ref, 16 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 25 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 6 sal from dual union all 
        select 2 con_ref, 'NON' col_ref, 33 sal from dual union all 
        select 3 con_ref, 'COL' col_ref, 42 sal from dual union all 
        select 3 con_ref, 'NON' col_ref, 51 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 63 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 31 sal from dual union all 
        select 4 con_ref, 'NON' col_ref, 15 sal from dual) 
-- end of mimicking a table called sample_data with data in it 
select distinct con_ref, 
       sum_sal 
from (select con_ref, 
       sum(sal) over (partition by con_ref) sum_sal, 
       count(case when col_ref != 'NON' then 1 end) over (partition by con_ref) cnt_non_non_con_ref 
     from sample_data) 
where cnt_non_non_con_ref = 0; 

    CON_REF SUM_SAL 
---------- ---------- 
     4  109 
     2   64 
+0

Совершенная Спасибо @Boneist – SAIar

+0

Есть ли способ получить тот же вывод без использования группы. Я имею в виду, просто используя инструкцию select. @boneist – SAIar

+0

Почему вы не хотите использовать группу? Вы хотите суммировать столбцы sal, так что вам придется использовать функцию SUM(). Теперь, вероятно, можно добиться того же результата, используя аналитические функции 'SUM()' и 'COUNT()' вместе с 'DISTINCT', но почему бы вам побеспокоить, когда вы можете сделать все это в простой группе с помощью инструкции? – Boneist

0

Ваш стол и его данные:

enter image description here

И этот блок кода решить вашу проблему, проверьте его:

select mt.con_ref ,sum(mt.sal) from mytable mt where mt.col_ref = 'NON' and not exists (select * from mytable mt1 where mt1.con_ref = mt.con_ref and mt1.col_ref <> 'NON') group by mt.con_ref ,mt.col_ref

И выход этот:

enter image description here

+0

Спасибо @ilhan Kaya – SAIar

Смежные вопросы