Подсчёт итогов для отдельных строк и вывод результата - MySQL
Формулировка задачи:
Есть запрос ответ следующий:
в конечном итоге нужно получить:
Как например перебрать все значения в запросе и добавить к ним UNION?
SELECT * FROM user
| name | point |
| ivanov | 5 |
| ivanov | 2 |
| petrov | 3 |
| sidorov | 1 |
| name | point |
| ivanov | 5 |
| ivanov | 2 |
| itogo | 7 |
| petrov | 3 |
| itogo | 3 |
| sidorov | 1 |
| itogo | 1 |
-- цикл SELECT * FROM user WHERE name='ivanov' UNION ALL SELECT 'itogo', SUM(point) s FROM (SELECT * FROM user WHERE name='ivanov') e -- конец цикла
Решение задачи: «Подсчёт итогов для отдельных строк и вывод результата»
textual
Листинг программы
MariaDB [test]> select * from test; +------+-------+ | name | point | +------+-------+ | ivan | 5 | | ivan | 2 | | petr | 3 | | sidr | 1 | +------+-------+ 4 rows in set (0.00 sec) MariaDB [test]> select name, `point` from ( -> select name x, name, `point` from test -> union all -> SELECT name, 'itogo', sum(`point`) `point` FROM test group by 1) t -> order by x,`point`; +-------+-------+ | name | point | +-------+-------+ | ivan | 2 | | ivan | 5 | | itogo | 7 | | itogo | 3 | | petr | 3 | | sidr | 1 | | itogo | 1 | +-------+-------+ 7 rows in set (0.01 sec)
Объяснение кода листинга программы
- Сначала выводится список всех строк из таблицы
test. - Затем, в подзапросе, создается временная таблица
t, которая содержит те же поля, что и исходная таблицаtest, а также новое полеx. - В этом подзапросе используется функция ROW_NUMBER(), которая пронумеровывает строки в каждом разделе, разделённом по значению поля
name. Значениеxво временной таблицеtбудет соответствовать номеру строки для каждого уникального значения поляname. - Затем, во внешнем запросе, используется функция SUM() для подсчета общего количества баллов для каждого уникального значения поля
name. - Результаты сортируются по полю
x(номеру строки) и полюpointв порядке возрастания. - Выводятся результаты, которые показывают количество баллов для каждого уникального значения поля
nameи общее количество баллов для всех строк с одинаковым именем.