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
我正在尝试将一列查询到 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