如何在 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?
损益表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?