如何在Postgresql中使用case when创建透视表?
我想使用postgresql创建一个透视表。我可以使用SQLite来实现这一点,我认为逻辑应该是类似的,但事实似乎并非如此 以下是示例表:如何在Postgresql中使用case when创建透视表?,postgresql,sqlite,pivot-table,Postgresql,Sqlite,Pivot Table,我想使用postgresql创建一个透视表。我可以使用SQLite来实现这一点,我认为逻辑应该是类似的,但事实似乎并非如此 以下是示例表: create table df( campaign varchar(50), date date not null, revenue integer not null ); insert into df(campaign,date,revenue) values('A','2019-01-01',10000); insert into df(campa
create table df(
campaign varchar(50),
date date not null,
revenue integer not null
);
insert into df(campaign,date,revenue) values('A','2019-01-01',10000);
insert into df(campaign,date,revenue) values('B','2019-01-02',7000);
insert into df(campaign,date,revenue) values('A','2018-01-01',5000);
insert into df(campaign,date,revenue) values('B','2018-01-01',3500);
下面是我的sqlite代码,用于将整洁的数据转换为透视表:
select
sum(case when strftime('%Y', date) = '2019' then revenue else 0 end) as '2019',
sum(case when strftime('%Y', date) = '2018' then revenue else 0 end) as '2018',
campaign
from df
group by campaign
结果如下:
2018 2019 campaign
5000 10000 A
3500 7000 B
我曾尝试使用postgres编写类似的代码,我将使用2019年:
select
sum(case when extract('year' from date) = '2019' then revenue else 0 end) as '2019',
campaign
from df
group by campaign
不知何故,代码不起作用,我不明白出了什么问题
Query Error: error: syntax error at or near "'2019'"
我错过了什么
db fiddle链接:
函数
strftime()
用于提取SQLite中日期的各个部分,但Postgresql不支持该函数。使用
date\u part()
:
或者使用Postgresql的过滤器
子句:
select campaign,
sum(revenue) filter (where date_part('year', date) = '2019') as "2019",
sum(revenue) filter (where date_part('year', date) = '2018') as "2018"
from df
group by campaign
此外,不要对表/列名使用单引号。SQLite允许,但Postgresql不允许
它只接受SQL标准的双引号。
请参阅。
此功能非常有效,谢谢!感谢您提供有关单/双报价的提示。他们似乎是问题的根源。
select campaign,
sum(revenue) filter (where date_part('year', date) = '2019') as "2019",
sum(revenue) filter (where date_part('year', date) = '2018') as "2018"
from df
group by campaign