Как агрегировать поля средневзвешенных значений на разных уровнях детализации? - PullRequest
0 голосов
/ 17 мая 2019

Я вычисляю взвешенную формулу для поля как сумма (доход) / сумма (кол-во), и это в соответствии с приведенным ниже запросом.Теперь я буду создавать представление, в котором будут храниться эти результаты, как показано в приведенном ниже коде.

Мой вопрос: если я выберу этот w_revenue из представления и захочу посмотреть в год, как я буду агрегировать впоказать это в год?См желаемые результаты.

select month,item, sum(revenue)/ Sum(qty) as w_revenue,
year
from my_revenue_table
group by month, year,item;

create view xyz as 
    select month,item, sum(revenue)/ Sum(qty) as w_revenue,
    year
    from my_revenue_table
    group by month, year,item;

select w_revenue 
from xyz.

Как мне сделать это, чтобы агрегировать это за год?

Year    Month   Item    Revenue Qty Sum(revenue)/Sum(Qty)
2019    Mar      A       10      2    5
2019    Mar      B       30      3    10
2019    Feb      C       50      1    50
2019    Feb      D       20      2    10

Ожидаемое значение, если я вижу в год:

Year    Sum(revenue)/Sum(Qty)
2019    13.75                         (10+30+50+20)/(2+3+1+2)

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

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

Если вы измените представление на что-то вроде этого:

create view xyz as 
    select year, month, item,
           sum(revenue)/ Sum(qty) as w_revenue,
           sum(qty) as total_qty
    from my_revenue_table
    group by month, year, item;

Тогда вы можете агрегировать результаты как:

select year, sum(w_revenue * total_qty) / sum(total_qty)
from xyz
group by year;

РЕДАКТИРОВАТЬ:

Или просто измените представление, чтобы получить необходимую информацию:

create view xyz as 
    select year, month, item,
           sum(revenue)/ Sum(qty) as w_revenue,
           sum(qty) as total_qty,
           (sum(sum(revenue)) over (partition by year, item) / 
            sum(sum(qty)) over (partition by year, item)
           ) as w_revenue_year
    from my_revenue_table
    group by month, year, item;
0 голосов
/ 17 мая 2019

группируется по year, затем создает другое представление как

create view abc as
select sum(revenue)/ Sum(qty) as w_revenue, year
  from my_revenue_table
 group by year;

и звоните

select * from xyz union all
select null, null, a.* from abc a

объединить их, если я вас правильно понял.

или доход за год, повторяющийся в каждой строке как

select x.*,
       (select w_revenue
         from abc
        where year = x.year) as w_revenue_year      
  from xyz x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...