PostgreSQL 如何将行转换为列
PostgreSQL how to convert rows to colums
我的 postgres BD 中有这样一个 table:
CREATE TABLE foo(id,type,date,value) AS
SELECT *
FROM ( VALUES
(11::smallint,'A','2016-06-06 19:00:00'::timestamp,81),
(11,'A','2016-06-06 20:00:00',70),
(11,'A','2016-06-06 21:00:00',35),
(11,'B','2016-06-06 19:00:00',2),
(11,'B','2016-06-06 20:00:00',0),
(11,'B','2016-06-06 21:00:00',0)
) as f;
这是数据,
id | type | date | value
----+------+---------------------+------
11 | A | 2016-06-06 19:00:00 | 81
11 | A | 2016-06-06 20:00:00 | 70
11 | A | 2016-06-06 21:00:00 | 35
11 | B | 2016-06-06 19:00:00 | 2
11 | B | 2016-06-06 20:00:00 | 0
11 | B | 2016-06-06 21:00:00 | 0
这是我想要得到的结果:
ID DATE A B
-----|----------------------|----|---
11 | 2016-06-06 19:00:000 | 81 | 2
11 | 2016-06-06 20:00:000 | 70 | 0
11 | 2016-06-06 21:00:000 | 35 | 0
有人知道我必须进行什么查询才能获得此结果吗?
您可以使用条件聚合:
SELECT t.id,t.date,
MAX(CASE WHEN t.type = 'A' THEN t.value END) as a_col,
MAX(CASE WHEN t.type = 'B' THEN t.value END) as b_col
FROM YourTable t
GROUP BY t.id,t.date
Sagi的方案不错,要用到很多类型可以创建一个request,生成sagi的请求:
select $$SELECT t.id,t.date,$$
||string_agg(distinct $$MAX(CASE WHEN t.type = '$$||"type"||$$' THEN t.value END) as $$||"type"||$$_col$$,',')
||$$ FROM YourTable t GROUP BY t.id,t.date$$
from YourTable
我的 postgres BD 中有这样一个 table:
CREATE TABLE foo(id,type,date,value) AS
SELECT *
FROM ( VALUES
(11::smallint,'A','2016-06-06 19:00:00'::timestamp,81),
(11,'A','2016-06-06 20:00:00',70),
(11,'A','2016-06-06 21:00:00',35),
(11,'B','2016-06-06 19:00:00',2),
(11,'B','2016-06-06 20:00:00',0),
(11,'B','2016-06-06 21:00:00',0)
) as f;
这是数据,
id | type | date | value
----+------+---------------------+------
11 | A | 2016-06-06 19:00:00 | 81
11 | A | 2016-06-06 20:00:00 | 70
11 | A | 2016-06-06 21:00:00 | 35
11 | B | 2016-06-06 19:00:00 | 2
11 | B | 2016-06-06 20:00:00 | 0
11 | B | 2016-06-06 21:00:00 | 0
这是我想要得到的结果:
ID DATE A B
-----|----------------------|----|---
11 | 2016-06-06 19:00:000 | 81 | 2
11 | 2016-06-06 20:00:000 | 70 | 0
11 | 2016-06-06 21:00:000 | 35 | 0
有人知道我必须进行什么查询才能获得此结果吗?
您可以使用条件聚合:
SELECT t.id,t.date,
MAX(CASE WHEN t.type = 'A' THEN t.value END) as a_col,
MAX(CASE WHEN t.type = 'B' THEN t.value END) as b_col
FROM YourTable t
GROUP BY t.id,t.date
Sagi的方案不错,要用到很多类型可以创建一个request,生成sagi的请求:
select $$SELECT t.id,t.date,$$
||string_agg(distinct $$MAX(CASE WHEN t.type = '$$||"type"||$$' THEN t.value END) as $$||"type"||$$_col$$,',')
||$$ FROM YourTable t GROUP BY t.id,t.date$$
from YourTable