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

#1 23/12/2014 14:48:19

lea
Membre

Boucle dans postgresql

Bonjour,

je cherche à faire une boucle dans postgresql mais je ne connais pas l'équivalent 'for' en postgresql...
Je cherche à faire ce genre de requête en gros :

table1
------------
code_com      pop          code_district
---------------------------------------------------------
21001        25                yu
21001        5                re
21001        2                tr   
21001        15                ZZ   
21002        68                ee
21002        6                rt
21002        30                ZZ
21003        108                ii   
21003        26                io
21003        88                ZZ
21004        52                fe
21004        98                cf
21004        8                ZZ   
21005        89                az
21005        78                ws   
21005        7                ZZ

--pour code_com = 21001
select * from (select *, pop+round((select zz1.pop from (select * from table1 where code_district='ZZ' AND code_com='21001')zz1 )*pop_portion) as repart from    
        (select *,pop/(select s1.sum from (select code_com, sum(pop) from table1 where code_district <> 'ZZ' AND code_com='21001' group by code_com order by code_com)s1) as pop_portion from
            (select* from table1 where code_com='21001')com21001 where code_district<>'ZZ' order by code_com, pop) foo) repart1

c'est une table fictive, j'ai beaucoup plus d'enregistrements que ça et la requête est juste un aperçu d'une requête plus longue ...

Je dois faire cette requête pour chaque code_com et faire une union de toutes les requêtes ce que j'aimerais éviter de faire, c'est :
requête pour code_com 21001 union requête pour code_com 21001 union requête pour code_com 21001 union requête pour code_com 21001

Et plutôt utiliser une boucle à partir de mes code_com  : de 21001 à 21005  avec un pas de 1,

mais je n'ai aucune idée comment faire cela sous postgresql, j'ai bien vu with recursive mais je ne sais pas si cela peut fonctionner dans ce cas et comment cela se met en place ...

Je ne sais pas pas si je suis claire ? ;D

Quelqu'un aurait une idée?

Lea

Hors ligne

#2 23/12/2014 15:19:49

lea
Membre

Re : Boucle dans postgresql

Bon il semblerait que j'avance avec:


WITH RECURSIVE t(n) AS (
    VALUES (21001)
  UNION ALL
    SELECT n+1 FROM t WHERE n < 21019
)

select * from (select *, pop+round((select zz1.pop from (select * from table1 where code_district='ZZ' AND code_com='21001')zz1 )*pop_portion) as repart from   
        (select *,pop/(select s1.sum from (select code_com, sum(pop) from table1 where code_district <> 'ZZ' AND code_com='21001' group by code_com order by code_com)s1) as pop_portion from
            (select* from table1 where code_com='21001')com21001 where code_district<>'ZZ' order by code_com, pop) foo) repart1

Mais le message suivant :
ERROR:  more than one row returned by a subquery used as an expression
********** Error **********

ERROR: more than one row returned by a subquery used as an expression
SQL state: 21000


Alors que ma requête seule fonctionne ...


Une idée?


Merci d'avance ...

Hors ligne

#3 24/12/2014 01:26:33

gleu
Administrateur

Re : Boucle dans postgresql

Je ne sais pas pas si je suis claire ? ;D

Absolument pas :-D

Peut-être qu'en donnant les données en entrées et les données résultats, je pourrais mieux comprendre smile


Guillaume.

Hors ligne

Pied de page des forums