如何使用 case when 在 Postgresql 中创建数据透视表 table?

How to create a pivot table in Postgresql using case when?

我想使用 postgresql 创建一个数据透视表 table。我可以使用 SQLite 完成此操作,我认为逻辑会类似,但事实并非如此。

这是示例 table:

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 代码,用于将 tidy 数据转换为 pivot table:

    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 link: https://www.db-fiddle.com/f/f1WjMAAxwSPRvB8BrxECN7/0

函数strftime()用于在SQLite中提取日期的各个部分,但Postgresql不支持。
使用 date_part():

select campaign,
  sum(case when date_part('year', date) = '2019' then revenue else 0 end) as "2019",
  sum(case when date_part('year', date) = '2018' then revenue else 0 end) as "2018"
from df
group by campaign

或者使用 Postgresql 的 FILTER 子句:

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

此外,不要对 table/column 个名称使用单引号。
SQLite 允许,但 Postgresql 不允许。
它只接受双引号,这是 SQL 标准。

参见demo