PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/12/2014 11:07:35

Geo-x
Membre

Utilisation crosstab ou autre solution ?

Bonjour @ tous.

Je galère un peu à utiliser la fonction crosstab (que je n'arrive pas vraiment à utiliser) sans vraiment savoir s'il s'agit de la solution idéale, je m'explique :

J'ai une table qui contient les champs suivants :

Col1           Col2
Service1      2014-02-10
Service1      2014-02-10
Service1      2013-02-10
Service2      2011-02-10
Service3      2012-02-10
Service3      2013-02-10

Ce que j'aimerais obtenir c'est :

Col1          2011    2012    2013    2014
Service1      0       0       1       2
Service2      1       0       0       0
Service3      0       1       1       0

Pour obtenir ce résultat j'ai tenté un crosstab dont j'ai visiblement du mal à comprendre le comportement en faisant :

SELECT * FROM crosstab (
'SELECT service,COUNT(*) nb,EXTRACT(YEAR FROM date)AS annee FROM device GROUP BY service,EXTRACT(YEAR FROM date) ORDER BY service,EXTRACT(YEAR FROM date)' ,
'SELECT DISTINCT EXTRACT(YEAR FROM date) AS annee FROM device')
as (service varchar,"2010" numeric, "2011" numeric, "2012" numeric, "2013" numeric, "2014" numeric)

Et le résultat de cette requête me donne :

Col1            2011  2012  2013  2014
Service1
Service2 
Service3

Merci de votre aide.

Geo-x

Hors ligne

#2 12/06/2015 09:21:12

guil31
Membre

Re : Utilisation crosstab ou autre solution ?

Déplacez le 'COUNT(*)' comme ci-dessous:

SELECT * FROM crosstab (
'SELECT service,EXTRACT(YEAR FROM date)AS annee  ,COUNT(*) nb FROM device GROUP BY service,EXTRACT(YEAR FROM date) ORDER BY service,EXTRACT(YEAR FROM date)' ,
'SELECT DISTINCT EXTRACT(YEAR FROM date) AS annee FROM device')
as (service varchar, "2011" numeric, "2012" numeric, "2013" numeric, "2014" numeric)

Hors ligne

Pied de page des forums