如何在 postgresql 中将摘要行添加到损益表

How to add summary rows to income statements in postgresql

损益表table具有结构:

sgroup char(30),
account char(10),
jan numeric(12,2),
feb numeric(12,2)

并具有值:

SGroup   Account  Jan     Feb

Sales   311      100     200
Sales   312       20      30
..
Other   410     3333      44
Other   411      333     344
...

如何将此 table 转换为每个组的 header 和小计:

Caption       Jan     Feb

Sales
 311          100     200
 312           20      30
Sales Total   120     230

Other
 410         3333     44
 411          333    344
Other total  3666    388
...          ...     ...
Grand Total  ...     ...

标题栏应包含组 header、帐号和每个组的组总数。 总数之后应该有空行。 在那之后应该有下一组等等。 最后应该有一个包含所有行总和的 "Grand Total" 行。

在 Debian 中使用 Postgres 9.1.2。
Debian 中的 Mono C# ASP.NET MVC 应用程序 运行。如果更合理的话,这个转换也可以在MVC控制器中完成。

我会计算 CTE 中每组的总和,以便在主查询中使用它三次:

WITH total AS (
   SELECT sgroup, 'Sales Total'::text AS c, sum(jan) AS j, sum(feb) AS f
   FROM   income_statement
   GROUP  BY 1
   )
(  -- parens required
SELECT caption, jan, feb
FROM  (
   SELECT 1 AS rnk, sgroup, account::text AS caption, jan, feb
   FROM   income_statement

   UNION ALL
   SELECT 0 AS rnk, sgroup, sgroup::text, NULL, NULL FROM total

   UNION ALL
   SELECT 2 AS rnk, * FROM total
   ) sub
ORDER  BY sgroup, rnk
)
UNION ALL
SELECT 'Grand Total', sum(j), sum(f) FROM total;

需要额外的一组括号来包含 ORDER BY

您可能不想使用数据类型char(30):

  • Any downsides of using data type "text" for storing strings?