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

次に、 'ピボット'を使うべきですが、それほど多くない場合(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

こんにちは@レミーバロン私はあなたのコードをsagisコードと組み合わせて使用​​し、データ出力は私に多くのSELECTクエリの結果をもたらします: – dbz

+0

それは正しいですか? – dbz

+0

いいえ、私のコードを使用して、sagiのクエリに基づいて1つのクエリを生成します。この生成されたクエリを実行すると、あなたの結果は –

関連する問題