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 03/07/2014 09:38:32

Geo-x
Membre

GROUP BY sur un SELECT CASE

Bonjour @ tous.

Je viens de réaliser une requête suffisamment simple pour me donner le résultat escompté au seul problème que je n'ai pas les résultats agrégés sur une seule ligne, je m'explique.

Je tente d'avoir pour une commune de départ, une commune d'arrivée, le nombre d'homme et le nombre de femmes (en tout 4 colonnes + identifiant unique). Je fais donc ma requête :

SELECT DISTINCT row_number() OVER () AS id_unique, commune_depart AS depart, commune_arrivee AS arrivee,
CASE
WHEN sexe = 1 THEN sum(nb)
END AS homme, 
CASE
WHEN sexe = 2 THEN sum(nb)
END AS femme
FROM flux
GROUP BY commune_depart, commune_arrivee,sexe

Mais en résultat j'ai :

id_unique depart     arrivee     homme     femme
1             Alfrome   Alfrime     16           
2             Alfrome   Alfrime                    32

Bien sur, ce que je voudrais, et vous l'aurez deviné c'est :

id_unique depart     arrivee     homme     femme
1             Alfrome   Alfrime     16            32

Est-ce que vous auriez une idée d'utilisation du GROUP BY avec un CASE ?

Par avance merci de votre aide.

Geo-x

Hors ligne

#2 03/07/2014 23:03:45

gleu
Administrateur

Re : GROUP BY sur un SELECT CASE

Pourquoi avoir ajouter la colonne sexe dans le GROUP BY ? vous ne voulez regrouper que par commune_depart et commune_arrivee.


Guillaume.

Hors ligne

#3 07/07/2014 08:55:53

Geo-x
Membre

Re : GROUP BY sur un SELECT CASE

Bonjour Gleu.

Je suis bien d’accord avec vous, et je ne souhaite pas faire de GROUP BY sur la colonne sexe, mais si je ne le met pas, postgres me fâche :

ERROR:  column "mobpro2011.sexe" must appear in the GROUP BY clause or be used in an aggregate function
LINE 5: WHEN sexe = 1 THEN sum(nb)

Hors ligne

#4 07/07/2014 10:33:22

gleu
Administrateur

Re : GROUP BY sur un SELECT CASE

Oui, logique. Donc il faut la coller dans la fonction d'agrégat :

SELECT DISTINCT row_number() OVER () AS id_unique, commune_depart AS depart, commune_arrivee AS arrivee,
sum(CASE
WHEN sexe = 1 THEN nb
ELSE 0
END) AS homme, 
sum(CASE
WHEN sexe = 2 THEN nb
ELSE 0
END) AS femme
FROM flux
GROUP BY commune_depart, commune_arrivee

Guillaume.

Hors ligne

#5 07/07/2014 10:38:51

Geo-x
Membre

Re : GROUP BY sur un SELECT CASE

Bonjour Gleu,

Je ne connaissais pas du tout cette syntaxe et j'avoue qu'elle ne m'avait jamais traversé l'esprit jusqu'à aujourd'hui ;-)

En tout cas, ça marche parfaitement, un grand merci à vous.

Hors ligne

Pied de page des forums