2017-01-13 3 views
-1

Мой набор результатов из запроса выглядит следующим образомГруппировка и агрегирование на основе конкретных условий

trackingnumber type   price 
------------------------------------------ 
12799467   AVRM   674.0536 
12799467   AVRM   860.7415 
12799467   PRICESTD  200.00 
12799468   PRICESTD  590.85 
12799469   PRICESTD  800 
12799470   PRICESTD  640 
12799471   PRICESTD  160 
12799472   PRICESTD  2080 
12799473   PRICESTD  354.3779 

Я хочу, чтобы сгруппировать эту по trackingnumber и в тех случаях, когда счетчик сгруппированных результирующего набора больше 1 возврата SUM всего price, который имеет type, так как AVRM еще возвращает отдельную цену, как есть. Если количество более, что ноль и ни один из них не имеет type AVRM, то это общая цена будет нулевой

Ожидаемый результат будет таким

trackingnumber Total Price 
----------------------------------------- 
12799467  1534.7951 --sum of price excluding 200 
12799468  590.85 
12799469  800 
12799470  640 
12799471  160 
12799472  2080 
12799473  354.3779 

Я не мог придумать способ, чтобы получить это делается для группировки по trackingnumber и проверкам type с помощью case заявления в select частях, но это только я считаю, не буду работать, так как мы не группа по type

Я не Сюры e, если это может быть достигнуто с использованием одного запроса.

+3

что, если есть другой ряд, как '12799468 PRICESTD 100'' Какой price' у вернется тогда? – Utsav

+2

, а также что, если где другая строка типа «123 AVRM 100». Поскольку это единственная запись для этого 'trackingnumber', вы вернете цену или нет. – Utsav

+0

@Utsav - если мы читаем проблему буквально, если есть только одна строка для номера отслеживания, тогда «вернуть индивидуальную цену как есть» - предложение «else» в заявлении о проблеме OP не ссылается на «AVRM» или 'не AVRM'. Но первый вопрос стоит: что, если для номера отслеживания есть несколько строк, ни один из которых не имеет тип 'AVRM'? Или это невозможно в реальных данных? – mathguy

ответ

3

Да, это может быть сделано в одном запросе.

with sample_data (tracking_Number, "TYPE", price) as 
( 
SELECT 12799467,'AVRM',674.0536 FROM DUAL UNION ALL 
SELECT 12799467,'AVRM',860.7415 FROM DUAL UNION ALL 
SELECT 12799467,'PRICESTD',200.00 FROM DUAL UNION ALL 
SELECT 12799468,'PRICESTD',590.85 FROM DUAL UNION ALL 
SELECT 12799469,'PRICESTD',800 FROM DUAL UNION ALL 
SELECT 12799470,'PRICESTD',640 FROM DUAL UNION ALL 
SELECT 12799471,'PRICESTD',160 FROM DUAL UNION ALL 
SELECT 12799472,'PRICESTD',2080 FROM DUAL UNION ALL 
SELECT 12799473,'PRICESTD',354.3779 FROM DUAL) 
SELECT tracking_number, 
     case when count(*) > 1 THEN 
      sum(decode("TYPE",'AVRM',price,null)) ELSE 
      sum(price) END price 
from sample_data 
group by tracking_number 
order by tracking_Number; 
0

Например, следующее решение. Добавить условие Exlude строки с типом не equla «AVRM», если строки с exests «AVRM»

with s (trackingnumber ,type  ,price) 
as (
select 12799467,'AVRM',674.0536 from dual union all 
select 12799467  ,'AVRM',   860.7415 from dual union all 
select 12799467  ,'PRICESTD',  200.00 from dual union all 
select 12799468   ,'PRICESTD',  590.85 from dual union all 
select 12799469   ,'PRICESTD',  800 from dual union all 
select 12799470   ,'PRICESTD',  640 from dual union all 
select 12799471   ,'PRICESTD',  160 from dual union all 
select 12799472   ,'PRICESTD',  2080 from dual union all 
select 12799473   ,'PRICESTD',  354.3779 from dual) 
select trackingnumber, 
     sum(price) 
from (select s.*,rownum as rn from s 
     where not exists (select null 
         from s subs 
       where s.trackingnumber = subs.trackingnumber 
        and s.type != 'AVRM' 
        and subs.type = 'AVRM') 
     ) 
group by trackingnumber, 
      case when type = 'AVRM' then 0 else rn end; 
Смежные вопросы