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/09/2016 13:21:08

damalaan
Membre

[Resolu] generate_series pour un retour sur tous les mois

Bonjour

je veux obtenir avec la requete ci dessous des stats par mois et par an, et si le mois n'existe pas (pas d'activité) il faut que ça affiche 0 ou null
par exemple je veux
2014 1 25
2014 2 0
2014 3 23
2014 4 65
2014 5 0
etc

or actuellement j'ai ce résultat
2014 1 25
2014 3 23
2014 4 65

j'ai essayé avec une jointure left mais je dois rater qqc !

with a as (
select generate_series(1,12) as mois),
b as (
select 
date_part('year', val_date)::integer as annee, 
date_part('Month', val_date)::integer as mois,
sum(val_valeur)as moyenne

from (tbl_analyse_ana natural join tbl_stat_sta natural join tbl_valeur_val)

where val_esp=2
and ana_id =4
and sta_id=61
and date_part('year', val_date) between 2014 and 2016
group by date_part('year', val_date) ,date_part('Month', val_date)
order by date_part('year', val_date), date_part('Month', val_date))

select b.annee,a.mois,b.moyenne from a left join b on a.mois=b.mois 
order by b.annee, a.mois

Dernière modification par damalaan (09/09/2016 16:32:00)

Hors ligne

#2 09/09/2016 14:12:35

gleu
Administrateur

Re : [Resolu] generate_series pour un retour sur tous les mois

De visu, ça a l'air bon. En testant de mon côté, ça fonctionne :

postgres=# with a as (
select generate_series(1,12) as mois),
b as (select i, 10 as j from generate_series(1, 5) i)
select a.mois, coalesce(b.j, 0) from a left join b on a.mois=b.i;
 mois | coalesce 
------+----------
    1 |       10
    2 |       10
    3 |       10
    4 |       10
    5 |       10
    6 |        0
    7 |        0
    8 |        0
    9 |        0
   10 |        0
   11 |        0
   12 |        0
(12 rows)

Évidemment, ce n'est pas exactement le même schéma. J'ai reconstitué avec ce que j'ai pu.


Guillaume.

Hors ligne

#3 09/09/2016 14:42:58

damalaan
Membre

Re : [Resolu] generate_series pour un retour sur tous les mois

j'ai identifié le problème
j'ai rajouté le coalesce pour forcer les valeurs à 0, mais en fait il me manque les années :

2015;1;72.000
2015;2;73.000
2015;3;39.000
2015;4;5.000
2015;7;1.000
2015;9;4.000
2015;10;16.000
2015;11;17.000
2015;12;37.000
;5;0
;6;0
;8;0

Hors ligne

#4 09/09/2016 15:46:56

rjuju
Administrateur

Re : [Resolu] generate_series pour un retour sur tous les mois

il vous faut générer l'année et le mois. Par exemple :

WITH a AS (select date_part('year', d) AS annee, date_part('month', d) AS mois from generate_series('2014-01-01'::date, '2016-12-01', '1 month') d)
...

Hors ligne

#5 09/09/2016 16:30:39

damalaan
Membre

Re : [Resolu] generate_series pour un retour sur tous les mois

nickel
merci!

Hors ligne

Pied de page des forums