postgresql,将列转换为 header 没有 rowid

postgresql, convert column into header without rowid

我正在尝试将一列查询到 header 中并对其求和。
我看到了一些使用交叉表的示例,但我不知道如何在没有 rowid 的情况下使其工作

是否有其他解决方法可以使其正常工作?

我的Table

货币|金额
人民币 | 12
IDR | 30
人民币 | 22
美元 | 58
IDR | 30

预期查询

RMB_sum | IDR_sum | USD_sum
34 | 60 | 58

正如您所说,您在编写此查询时预先知道所有货币值,您可以简单地使用条件聚合。当您使用 PostgreSQL 9.1 时,您只能通过将 sum() 与 case 语句混合来完成此操作:

select
    sum(case when currency = 'RMB' then amount else 0 end) as RMB_sum,
    sum(case when currency = 'IDR' then amount else 0 end) as IDR_sum,
    sum(case when currency = 'USD' then amount else 0 end) as USD_sum
from
    __transactions

(注意上面使用了隐式分组——我的 select 语句中的所有内容都是一个聚合函数,因此不需要显式地对查询进行分组)


如果您使用的是 PostgreSQL 9.4+,则可以使用过滤器指令简化上述操作:

select
    sum(amount) filter(where currency = 'RMB') as RMB_sum,
    sum(amount) filter(where currency = 'IDR') as IDR_sum,
    sum(amount) filter(where currency = 'USD') as USD_sum
from
    __transactions