使用 postgresql 的标签、字幕、记录和小计

Tags, subtitles, records and subtotals using postgresql

我使用基于列表的报告。此列表包含三个元素:

副标题 记录 小计 等等...

每行都有一个格式化标签:

H Subtitle
R Record
S Subtotal

.

老办法——两步解决

首先,我根据记录创建了一个唯一代码列表

SELECT DISTINCT ON (rec_code) rec_code FROM records

然后我在我的前端工具中循环此 "list" 并为每个代码获取记录

SELECT * FROM records where rec_code=list.rec_code

这是完成工作的一种相当简单的方法,但速度很慢。

.

寻找新方法 - 一步

我最接近的是模仿小计。但是仍然缺少字幕和标签

select rec_code, rec_sum
    from (
    select rec_code, 'name' as name, rec_sum, rec_code as o
    from rec as a
    union all
    select 'Subtotal', 'name' as name, sum(rec_sum), rec_code as o
    from rec as a
    group by rec_code
    ) as a
order by o, rec_sum

http://sqlfiddle.com/#!3/270d6/10

这是这个 sqlfiddle 想要的输出

H code a
R A         1
R A         2
S Subtotal  3

H code b
R B         3
R B         3
S Subtotal  6

这可能吗?又如何?

提前感谢您提供任何线索!

你真的应该在应用层做这个格式化。但是,您可以将更接近的 SQL 查询放在一起。 For instance:

select rec_code, rec_sum
from (
    select rec_code, 'name' as name, rec_sum, rec_code as o, 2 as o2
    from rec as a
    union all
    select 'Subtotal', 'name' as name, sum(rec_sum), rec_code as o, 2 as o2
    from rec as a
    group by rec_code
    union all
    select code_name, 'header' as name, NULL, code_id as o, 1 as o2
    from code
) a
order by o, o2, rec_sum;
with codes as (
    select *
    from rec
    join code on rec_code = code_id
    )
select tag, cname, rec_sum
from (
    select code_name, 'R' tag, rec_code cname, rec_sum
    from codes
    union all
    select distinct on (code_id) code_name, 'H' tag, code_name, null
    from codes
    union all
    select code_name, 'S' tag, 'Subtotal', sum(rec_sum)
    from codes
    group by 1
    order by 1,2
    ) sub

SqlFiddle