#sql
#sql
Вопрос:
У меня есть следующие денормализованные данные:
╔════╦═══════╦══════════╦════════════╗
║ id ║ value ║ group_id ║ group_name ║
╠════╬═══════╬══════════╬════════════╣
║ 0 ║ 10 ║ 0 ║ Group 0 ║
║ 1 ║ 10 ║ 0 ║ Group 0 ║
║ 2 ║ 10 ║ 0 ║ Group 0 ║
║ 3 ║ 10 ║ 0 ║ Group 0 ║
║ 4 ║ 10 ║ 1 ║ Group 1 ║
║ 5 ║ 10 ║ 1 ║ Group 1 ║
║ 6 ║ 10 ║ 1 ║ Group 1 ║
║ 7 ║ 10 ║ 2 ║ Group 2 ║
║ 8 ║ 10 ║ 2 ║ Group 2 ║
║ 9 ║ 10 ║ 2 ║ Group 2 ║
╚════╩═══════╩══════════╩════════════╝
В настоящее время я выполняю запрос, который суммирует значение по group_id
:
select sum(value), group_id
from table
group by group_id
Как мне расширить этот запрос, чтобы также включить group_name
для каждого столбца? Мне нужно, чтобы мой результат выглядел так:
╔═══════╦══════════╦════════════╗
║ value ║ group_id ║ group_name ║
╠═══════╬══════════╬════════════╣
║ 40 ║ 0 ║ Group 0 ║
║ 30 ║ 1 ║ Group 1 ║
║ 30 ║ 2 ║ Group 2 ║
╚═══════╩══════════╩════════════╝
Это единственный способ сделать это для использования OVER
?
Комментарии:
1.
select group_name,group_id,sum(value) from table group by group_name,group_id
Ответ №1:
У вас есть два варианта. Одним из них является использование функции агрегирования:
select sum(value), group_id, max(group_name) as group_name
from table
group by group_id;
Второй — включить столбец, не объединенный в select
и group by
:
select sum(value), group_id, group_name
from table
group by group_id, group_name;
Ответ №2:
- Пожалуйста, укажите поставщика БД.
- Ваш запрос
select sum(value), group_id from table
недействителен, я предполагаю, что вы выполняетеselect sum(value), group_id from table group by group_id
. - Предполагая, что вы доверяете своей денормализации и
group_name
всегда зависите отgroup_id
нее, вы можете просто добавитьgroup_name
вgroup by
иselect
предложение:select sum(value), group_id, group_name from table group by group_id, group_name
Ответ №3:
Используйте group by
!
select sum(value) as value, group_id, group_name
from mytable
group by group_id, group_name
В стандартном SQL ваш исходный запрос не является допустимым запросом агрегации для начала. Все неагрегированные столбцы должны отображаться в group by
предложении (поэтому вам нужен group by
group_id`), хотя некоторые базы данных (а именно MySQL) можно настроить, чтобы разрешить иное.
Комментарии:
1. ах, это так просто?