2017-06-09 9 views
0

私はグループの後にすべての列を比較する方法は?

date  | c1 | c2 | count 
----------+-------+-------+------ 
2015-12-22 A  B  1 
2015-12-30 C  D  2 
2015-12-31 A  B  3 
2015-12-31 A  C  5 
2016-01-01 A  B  1 
2016-01-01 A  D  7 
2016-01-01 B  C  1 
2016-01-03 B  D  3 
2016-01-03 C  D  1 

私は何を取得したいことは二人がその特定の日にお互いに相互作用頻度を示しており、日ごとに行を持つテーブルであるとPostgreSQLのテーブルを持っている:

date  |AB |AC |AD |BC |BD |CD 
-----------+---+---+---+---+---+-- 
2015-12-22 1 0 0 0 0 0 
2015-12-30 0 0 0 0 0 2 
2015-12-31 3 5 0 0 0 0 
2016-01-01 1 0 7 1 0 0 
2016-01-03 0 0 0 0 3 1 

私はすでにその人物を名前でソートしましたが(c1 < c2)、これらの人をすべて比較して新しい列として選択する方法はわかりません。

答えて

2

条件付き集計でこれを行うことができます。 c1 < c2と仮定すると:

select date, 
     sum(case when c1 = 'A' and c2 = 'B' then cnt else 0 end) as AB, 
     sum(case when c1 = 'A' and c2 = 'C' then cnt else 0 end) as AC, 
     sum(case when c1 = 'A' and c2 = 'D' then cnt else 0 end) as AD, 
     sum(case when c1 = 'B' and c2 = 'C' then cnt else 0 end) as BC, 
     sum(case when c1 = 'B' and c2 = 'D' then cnt else 0 end) as BD, 
     sum(case when c1 = 'C' and c2 = 'D' then cnt else 0 end) as CD 
from t 
group by date 
order by date; 
+0

、また、リスト/クエリからのものを作成することは可能でしょうか?私にはたくさんの人がいるので、それらをすべて宣言したくないのです。 – vtni

+1

@vtri。 。 。次に動的クエリ問題が発生します。あなたは*この質問とは非常に異なるので*別の*質問をするべきです。 (この質問を変更した場合、この答えは無効になります。これは、下線を引く可能性があります)。 –

関連する問題