Я хочу использовать SELECT With ROLLUP в MariaDB, чтобы получить сводную строку в наборе результатов, а также упорядочить оставшиеся строки по SUM() DESC
. Как лучше всего этого добиться?
Используя пример со связанной страницы документации:
CREATE TABLE booksales (
country VARCHAR(35), genre ENUM('fiction','non-fiction'), year YEAR, sales INT);
INSERT INTO booksales VALUES
('Senegal','fiction',2014,12234), ('Senegal','fiction',2015,15647),
('Senegal','non-fiction',2014,64980), ('Senegal','non-fiction',2015,78901),
('Paraguay','fiction',2014,87970), ('Paraguay','fiction',2015,76940),
('Paraguay','non-fiction',2014,8760), ('Paraguay','non-fiction',2015,9030);
SELECT year, SUM(sales) FROM booksales GROUP BY year WITH ROLLUP;
+------+------------+
| year | SUM(sales) |
+------+------------+
| 2014 | 173944 |
| 2015 | 180518 |
| NULL | 354462 |
+------+------------+
Как мне упорядочить строки по SUM(sales) DESC
, сохранив при этом итоговую строку в конце?
Очевидно, @ysth WITH ROLLUP
нельзя использовать с ORDER BY
в MariaDB.
верно, вам нужно обернуть его как подзапрос и указать порядок во внешнем запросе: dbfiddle.uk/rkjywQ-2
Могут быть и более простые способы добиться этого, но, учитывая, что результатом свертки является добавление дополнительной сводной строки со значениями NULL для столбцов, указанных в GROUP BY
, если вы обернете запрос в CTE или производную таблицу, вы может обдумать результат (после присвоения столбцу SUM имени), а затем вручную манипулировать порядком следующим образом:
WITH Cte AS
(
SELECT
year,
SUM(sales) AS TotSales
FROM
booksales
GROUP BY
year ASC WITH ROLLUP
)
SELECT *
FROM Cte
ORDER BY CASE WHEN year IS NOT NULL THEN TotSales * -1 ELSE 0 END ASC;
(Выше я предполагаю, что СУММА должна быть положительной - в противном случае вам придется найти другой хитрый способ гарантировать, что NULL-год будет помещен последним)
никаких хитрых способов не требуется, просто используйте несколько условий заказа order by year is null, sum(sales) desc
хотя, если год имеет нулевое значение, это становится сложнее. в mysql это возможно, но в mariadb нет функции группировки. тогда тебе нужно быть хитрым
Да, вы правы
@Akina для mariadb, да (добавив DESC). в MySQL вы бы сделали
ORDER BY GROUPING(year), SUM(sales) DESC