2016-12-07 21 views
1

我有一个这样的表在我的Postgres BD:的PostgreSQL怎么行转换为colums

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 

任何人都知道什么是我得到这个结果的查询?

回答

1

可以使用条件汇总:

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 
+0

感谢@sagi,有用!!!但问题是我有很多类型,而且我很难用它们来进行查询。 – dbz

+0

然后你应该使用'Pivot',但是要告诉你实话,如果它不那么多,(20左右)我更喜欢使用这个版本。 – sagi

+0

他们就像800个类型......它更好地使用枢轴在我的情况? – dbz

0

鹭的解决方案是好的,用了很多的类型,您可以创建生成鹭的请求的请求:

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 
+0

Hi @RémyBaron我使用你的代码结合sagis代码和数据输出给了我很多SELECT查询的结果: – dbz

+0

这是正确的? – dbz

+0

不只是使用我的代码,它会根据sagi的查询生成一个查询。执行这个生成的查询,你有你的结果 –