【问题标题】:How to add summary rows to income statements in postgresql如何在 postgresql 中将汇总行添加到损益表
【发布时间】:2015-04-21 20:11:25
【问题描述】:

损益表有结构:

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
...

如何将此表转换为每个组的标题和小计:

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  ...     ...

标题栏应包含每个组的组标题、帐号和组总计。 总计后应该有空行。 在那之后应该有下一组等。 最后应该有一个“总计”行,其中包含所有行的总和。

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

【问题讨论】:

    标签: sql asp.net-mvc postgresql aggregate postgresql-9.1


    【解决方案1】:

    我会计算 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)

    【讨论】:

    • 优秀。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多