2017-06-09 2 views
0

J'ai une table PostgreSQL avec unComment comparer toutes les colonnes après le groupe?

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 

Ce que je veux est une table avec une ligne pour chaque jour, ce qui montre à quelle fréquence deux personnes ont interagi entre eux à ce jour précis:

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 

J'ai déjà trié les personnes par leur nom (c1 < c2) mais je ne sais pas comment comparer toutes ces personnes possibles et les sélectionner comme une nouvelle colonne.

Répondre

2

Vous pouvez le faire avec l'agrégation conditionnelle. En supposant que 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

serait-il possible de créer ceux d'une liste/requête? J'ai beaucoup de personnes, c'est pourquoi je ne voudrais pas les déclarer tous. – vtni

+1

@vtri. . . Ensuite, vous avez un problème de requête dynamique. Vous devriez poser une * autre * question, car c'est très différent de cette question. (Si vous changez cette question, vous invaliderez cette réponse, qui est susceptible d'entraîner des downvotes). –