如何使用 Postgresql 对 table 的所有列值求和并在新行中显示总数
How to sum all columns value of a table and display the total in new row by using Postgresql
我正在使用正常的 select 查询来显示所有行
SELECT
type,
debit,
credit,
(debit-credit) as balance
from bank_cash_registers
显示如下图
现在我需要在 Postgresql 查询的帮助下将此总计显示为附加行,如下图所示。我怎样才能做到这一点?
还有是否有任何选项可以根据类型单独计算总计,如下所示。
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)
另一种方法是使用 grouping sets。它的优点是易于扩展。此外,我认为它是专门为此目的创建的。
这应该比 UNION 解决方案更有效,因为数据只传递一次。
下面查询returns你想要什么:
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 SETS 子句):
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), ());
我正在使用正常的 select 查询来显示所有行
SELECT
type,
debit,
credit,
(debit-credit) as balance
from bank_cash_registers
显示如下图
现在我需要在 Postgresql 查询的帮助下将此总计显示为附加行,如下图所示。我怎样才能做到这一点?
还有是否有任何选项可以根据类型单独计算总计,如下所示。
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)
另一种方法是使用 grouping sets。它的优点是易于扩展。此外,我认为它是专门为此目的创建的。
这应该比 UNION 解决方案更有效,因为数据只传递一次。
下面查询returns你想要什么:
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 SETS 子句):
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), ());