2017-01-04 1 views
1

Я использую обычный запрос на выборку, чтобы отобразить все строкиКак суммировать все столбцы значение таблицы и отобразить итог в новой строке с помощью Postgresql

SELECT 
    type, 
    debit, 
    credit, 
    (debit-credit) as balance 
from bank_cash_registers 

Его отображаются как на изображении ниже enter image description here

Теперь мне нужно отобразить эту сумму как дополнительную строку с помощью запроса Postgresql, например, ниже. Как я могу это достичь?

enter image description here

, а также является ли какой-либо вариант для отдельной общей сложности в зависимости от типа, как показано ниже .. enter image description here

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images- of-code-on-so-when-ask-a-question/285557 # 285557 –

ответ

2
SELECT type 
    ,debit 
    ,credit 
    ,(debit - credit) as balance 
FROM bank_cash_register 

UNION ALL 

SELECT 'Total: ' 
    ,sum(debit) 
    ,sum(credit) 
    ,sum((debit - credit)) 
FROM bank_cash_register 

В группе общее основанный на столбце Тип

SELECT * 
FROM (
    SELECT type 
      ,debit 
      ,credit 
      ,(debit - credit) as balance 
    FROM bank_cash_register 

    UNION ALL 

    SELECT type || '_total' 
      ,sum(debit) 
      ,sum(credit) 
      ,sum((debit - credit)) 
    FROM bank_cash_register 
    GROUP BY 1 
    ) t 
ORDER BY split_part(type, '_', 1) 

Пройти split_part()

Demo

+0

Nice ... Его работа .. – Mani

+0

Можно ли отображать несколько итогов на основе типа? Я обновил вопрос. – Mani

+0

@ Мани проверить обновление! –

2

Другой способ сделать это с помощью 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),()); 
Смежные вопросы