Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Postgresql中使用case when创建透视表?_Postgresql_Sqlite_Pivot Table - Fatal编程技术网

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

如何在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

我想使用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(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