Мы можем использовать встроенное представление для вычисления итога и выполнить операцию соединения.
Примерно так:
SELECT t.column1
, SUM(t.column2_number) AS `column2`
, SUM(t.column3_number) AS `column3`
, ( 100.0
* SUM(t.column3_number)
/ s.col3_tot
) AS `percentage`
FROM `table` t
CROSS
JOIN ( SELECT SUM(q.column3_number) AS col3_tot
FROM `table` q
) s
GROUP
BY t.column1
, s.col3_tot
ORDER
BY t.column1 ASC
MySQL выполняет запрос встроенного представления для материализации производной таблицы s
, состоящей из одной строки с общим количеством column3_number.
Эта строка присоединяется к каждой строке, возвращаемой из t
, поэтому значение col3_tot
доступно в каждой строке, и мы можем использовать его в выражении в списке SELECT.
(я пропустил предложение WITH ROLLUP
, чтобы пояснить, что WITH ROLLUP
не имеет никакого отношения к получению суммы или вычислению процентов.)