Мне нужно написать SQL-запрос в MariaDB, чтобы напечатать отчет с промежуточными строками с агрегированными значениями.

Например данные в таблице EMP:

EmpName    ROLE         SALARY
A          Manager      10000
B          operator      8000
C          operator      8500
D          GM           20000
E          Manager       9000

Мне нужен вывод, как:

ROLE       EmpName    SALARY
Manager    A          10000
           E           9000
TOTAL                 19000
----------------------------
GM         D          20000
TOTAL                 20000 
----------------------------
operator   B           8000
           C           8500
TOTAL                 16500

Спасибо заранее.

1
arvind 5 Апр 2017 в 09:12

2 ответа

Лучший ответ

Попробуйте использовать модификатор WITH ROLLUP, например -

SELECT
  role, empname, SUM(salary)
FROM
  table1
GROUP BY
  role, empname WITH ROLLUP;

Выход:

GM        D       20000
GM        (null)  20000
Manager   A       10000
Manager   E       9000
Manager   (null)  19000
operator  B       8000
operator  C       8500
operator  (null)  16500
(null)    (null)  55500

Все значения NULL для сгруппированных столбцов являются итоговыми значениями. Последний ряд - это общая сумма всех зарплат.

Документация по модификаторам GROUP BY WITH ROLLUP.

1
Devart 5 Апр 2017 в 06:37

Следующий запрос может выдать вывод, похожий на тот, который вы хотите:

SELECT IF(type = 1, ROLE, 'TOTAL'), SALARY
FROM (
   SELECT ROLE, SALARY, 1 AS type
   FROM mytable

   UNION ALL

   SELECT ROLE, SUM(SALARY) AS TotalSalary, 2 AS type
   FROM mytable
   GROUP BY ROLE) AS t
ORDER BY ROLE, type  

Демо здесь

2
Giorgos Betsos 5 Апр 2017 в 06:30