2016-12-07 10 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

Привет @ Rémy Baron Я использую ваш код в сочетании с кодом sagis, и вывод данных дает мне результат с большим количеством запросов SELECT: – dbz

+0

Это правильно? – dbz

+0

не просто использовать мой код, который генерирует один запрос на основе запроса sagi. Выполните этот сгенерированный запрос, и у вас есть результат. –

 Смежные вопросы

  • Нет связанных вопросов^_^