如何使用 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。
我想使用 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。