postgres sql 查询按多列结果转换组

postgres sql query to convert group by result in multiple columns

我有两张桌子

  1. financial_account 有列 account_name
  2. financial_transaction 具有列 transaction_date、transaction_type、transaction_amount

我需要数据作为 SUM(transaction_amount),其中 transaction_type='A' 在列 SUM_A 下,SUM(transaction_amount) 在列 [=51] 下=] 其中 transaction_type='B'

我参考了 Whosebug post,写了如下查询:

select fa.account_name ,
to_char(current_date - interval '1' month, 'Mon-YY') as "Previous Month",
SUM(case when ft.transaction_type='A' then ft.transaction_amount else 0 end) as "SUM_A",
SUM(case when ft.transaction_type='B' then ft.transaction_amount else 0 end) as "SUM_B"

from financial_transaction ft

join financial_account fa on fa.account_name = 'XYZ'

where ft.transaction_date  >= date_trunc('month', now()) - interval '1 month' and
      ft.transaction_date  < date_trunc('month', now())

group by ft.transaction_type,fa.account_name

having ft.transaction_type in ('A','B')

但是,此查询生成两行数据

我需要单行格式的数据。

如何获取 1 一行格式的数据?

考虑到您的查询工作正常,您可以编写如下查询:

select 
fa.account_name ,
to_char(current_date - interval '1' month, 'Mon-YY') as "Previous Month",
SUM(case when ft.transaction_type='A' then ft.transaction_amount else 0 end) as "SUM_A",
SUM(case when ft.transaction_type='B' then ft.transaction_amount else 0 end) as "SUM_B"
from financial_transaction ft
join financial_account fa on fa.account_name = 'XYZ'
where ft.transaction_date  >= date_trunc('month', now()) - interval '1 month' and
      ft.transaction_date  < date_trunc('month', now()) and ft.transaction_type in ('A','B')

group by 1,2

你也可以这样写:

select 
fa.account_name ,
to_char(current_date - interval '1' month, 'Mon-YY') as "Previous Month",
SUM(ft.transaction_amount) filter (where ft.transaction_type='A') as "SUM_A",
SUM(ft.transaction_amount) filter (where ft.transaction_type='B') as "SUM_B",
from financial_transaction ft
join financial_account fa on fa.account_name = 'XYZ'
where ft.transaction_date  >= date_trunc('month', now()) - interval '1 month' and
      ft.transaction_date  < date_trunc('month', now()) and ft.transaction_type in ('A','B')
group by 1,2

基本上,您要从 group by 子句中删除 ft.transaction_type,因此同一帐户的所有行都组合在一起。

请允许我指出,您的查询似乎缺少交易和帐户之间的连接条件。

我会将查询写成:

select 
    fa.account_name,
    trunc(current_date - interval '1' month) as previous_month,
    sum(ft.transaction_amount) filter(where ft.transaction_type = 'A') as sum_a,
    sum(ft.transaction_amount) filter(where ft.transaction_type = 'B') as sum_b
from financial_transaction ft
inner join financial_account fa on ??
where 
    fa.account_name = 'XYZ'
    and ft.transaction_date  >= date_trunc('month', current_date) - interval '1 month' 
    and ft.transaction_date  < date_trunc('month', current_date)
    and ft.transaction_type in ('A','B')
group by fa.account_name

对原始代码的更改:

  • 修复了 group by 子句

  • 我将缺少的连接条件表示为 ??

  • 交易类型的条件应该属于where子句而不是having子句

  • 可以使用标准 filter 子句

    简化条件和