когда выполняется более одного условия, как сгруппировать их для вычисления среднего - PullRequest
0 голосов
/ 23 января 2019

Я использую базу данных Oracle и хочу рассчитать среднюю цену продукта для разных регионов.

Пример:

prod,amt,price
X,100,1
X,180,2
X,250,3
Y,90,2
Y,170,3
Y,280,3

Здесь продукт X продается за 100 в одном регионе и 180 в другом регионе ... и т. Д.

Теперь для некоторых аналитиков они сгруппированы в разные диапазоны, которые перекрываются, и мне нужно вычислить среднее значение цены на основе диапазона

Требуемый вывод

prod,rang(Amt),mean(price),
X,[0-200],1.5,
X,[150-300],2.5,
Y,[0-200],2.5,
Y,[150-300],3,

Обратите внимание, что есть много диапазонов, и я дал только 2 для ясности.

Я попробовал, как показано ниже, но case соответствует первому условию и просто дает одно значение для X для [0-200], где мне нужно 2 записи

select prod, amt, price, 
case 
when amt between 0 and 200 then amt
when amt between 150 and 300 then amt
end as rng
from tablea

Как получить 2 записи на совпадение в выписке по делу?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете использовать conditional aggregation, а затем unpivot как

   select prod_a as "Prod",
          prod as "Range of Amounts",
          value as "Mean Price"
     from  
            (
            with tablea(prod,amt,price) as
            (
              select 'X',100,1 from dual union all
              select 'X',180,2 from dual union all
              select 'X',250,3 from dual union all
              select 'Y',90, 2 from dual union all
              select 'Y',170,3 from dual union all
              select 'Y',280,3 from dual 
            )
            select prod as prod_a,  
            avg(case when amt between 0 and 200 then price end) as avg_0_200,
            avg(case when amt between 150 and 300 then price end) as avg_150_300
            from tablea a
            group by prod
             ) b  
    unpivot(value for prod in(avg_0_200,avg_150_300))
    order by prod_a;

   Prod  Range of Amounts   Mean Price
   ----  ----------------    ----------
   X     AVG_0_200              1.5
   X     AVG_150_300            2.5
   Y     AVG_0_200              2.5
   Y     AVG_150_300            3

Rextester Demo

0 голосов
/ 23 января 2019

Сделайте два запроса с одним условием и объедините их.Это не идеальное решение, но оно будет работать.

SELECT prod, '0-200' rang, AVG( price )
FROM   table_name
WHERE  amt BETWEEN 0 AND 200
GROUP BY prod
UNION ALL
SELECT prod, '150-300' rang, AVG( price )
FROM   table_name
WHERE  amt BETWEEN 150 AND 300
GROUP BY prod
...