Другой способ сделать это с помощью grouping sets. Его преимущество в том, что его можно легко расширить. Кроме того, я думаю, что он был создан специально для этой цели.
Это должно быть более эффективным, чем решение UNION, поскольку данные передаются только один раз.
Следующий запрос возвращает то, что вы хотите:
SELECT COALESCE(type, 'Total: '), SUM(debit), SUM(credit), SUM(debit - credit) AS balance
FROM bank_cash_registers
GROUP BY GROUPING SETS ((type, debit, credit),());
следующие группы запросов вместе значений, имеющих один и тот же тип (обратите внимание, что единственное, что изменилось, так это GROUPING НАБОРЫ пункт):
SELECT COALESCE(type, 'Total: '), SUM(debit), SUM(credit), SUM(debit - credit) AS balance
FROM bank_cash_registers
GROUP BY GROUPING SETS ((type),());
Результат:
bank 0 1500 -1500
cash 0 700 -700
Total: 0 2200 -2200
Обновленное вопрос можно решить, что путь следующим образом:
SELECT
CASE WHEN GROUPING(debit) > 0 THEN 'Total: ' ELSE type END AS type,
SUM(debit), SUM(credit), SUM(debit - credit) AS balance
FROM bank_cash_registers
GROUP BY GROUPING SETS ((type, debit, credit), (type));
Вы даже можете добавить большую сумму с
(...) GROUPING SETS ((type, debit, credit), (type),());
http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images- of-code-on-so-when-ask-a-question/285557 # 285557 –