SQL: группировка по накоплению с несколькими столбцами

0

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

Ниже приведен запрос + упрощенная структура таблицы, которую я использую atm.

create table income_region (year int,region varchar(40),income float)

insert into income_region (income,region,year) values (2000,'North America', 2000)
insert into income_region (income,region,year) values(2200,'Europe', 2000)
insert into income_region (income,region,year) values(2101,'North America', 2001)
insert into income_region (income,region,year) values(2001,'Europe', 2001)
insert into income_region (income,region,year) values(2400,'North America', 2000)

select avg(income) as avg_income ,region,year as year
from income_region group by region,year with rollup 

Проблема с вышеупомянутым запросом состоит в том, что он показывает только Нуль для региона, когда год также является Нулевым. В то время как я хотел бы получить новые строки, где регион равен нулю, а год 2000. И еще один, где регион равен нулю, а год 2001.

Таким образом, мы получаем все типы вариаций в качестве результата (и не только за год). Это должно выглядеть примерно так:

avg_income region        year

2200      Europe         2000   
2001      Europe         2001    
2100.5    Europe         Null
2200      North America  2000     
2101      North America  2001   
2167      North America  Null    
2140.4    Null           Null 
2200      Null           2000
2050.5    Null           2001
  • 0
    Учитывая ваши данные образца вы можете добавить желаемый результат.
Теги:

1 ответ

1
Лучший ответ

К сожалению, MySQL не поддерживает ни Cube, ни модификаторы наборов группировки, которые сделали бы эту задачу легкой. Поскольку сведение формирует иерархию для суперагрегатов, вам нужно объединить результаты, чтобы получить полный набор агрегатов.

select avg(income) as avg_income ,region,year as year
from income_region group by region,year with rollup
Union all 
Select avg(income) as avg_income ,null as region,year as year
from income_region group by year

НТН

  • 0
    Спасибо. Это масштабируется до более 2 столбцов. Например за 3-5?
  • 0
    Да, но вам нужно будет указать все необходимые комбинации столбцов. Вы также можете использовать свертку с вашей группой по столбцам в обратном порядке для более чем 2 столбцов, просто убедитесь, что вы не вычисляете одни и те же агрегаты более одного раза.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню