postgres sql 查询按多列结果转换组
postgres sql query to convert group by result in multiple columns
我有两张桌子
- financial_account 有列 account_name
- 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
子句
简化条件和
我有两张桌子
- financial_account 有列 account_name
- financial_transaction 具有列 transaction_date、transaction_type、transaction_amount
我需要数据作为 SUM(transaction_amount),其中 transaction_type='A' 在列 SUM_A 下,SUM(transaction_amount) 在列 [=51] 下=] 其中 transaction_type='B'
我参考了
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
子句