Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 29 August 2012 19:52

Loudo
Juste Inscrit !
Lieu: Morges
Date d'inscription: 28 Aug 2012
Messages: 7

[Postgis] Création d'une vue avec un count par colonne

Bonjour,

Je vais tâcher d'être compréhensible.

j'ai une vue avec des interventions de police par quartier.

Je cherche à créer une autre vue avec une ligne par quartier et une colonne par type intervention (16) ce qui donnerait quelque chose du genre:

gid      vol     accident     overdose     the_geom

1         4           3                0                ....

2         3           1                2                ....

les valeurs des champs sont des totaux du nombre d'interventions de chaque type.

Suis-je claire?

Merci de votre aide

Ludovic

Hors ligne

 

#2 Wed 29 August 2012 21:28

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: [Postgis] Création d'une vue avec un count par colonne

Bonsoir Ludovic,

quelle est la structure de la vue initiale (interventions de police par quartier) ?

Dernière modification par Mathieu BOSSAERT (Wed 29 August 2012 21:28)


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#3 Wed 29 August 2012 21:35

Loudo
Juste Inscrit !
Lieu: Morges
Date d'inscription: 28 Aug 2012
Messages: 7

Re: [Postgis] Création d'une vue avec un count par colonne

Bonsoir,

La vue contient des infos sur l'adresse, le type de l'intervention, l'id de l'intervention et d'autres champ qui ne me sont pas utiles pour la vue finale.

Ma vue contient déjà la géométrie du quartier.
La vue initiale peut toujours être adaptée facilement.

Merci de votre aide

Hors ligne

 

#4 Thu 30 August 2012 09:26

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour,
Comme le dit mathieu, il n'est pas facile de savoir comment construire un requête sans avoir la structure de la base et des tables concernées.
J'imagine qu'il y a une table quartiers avec le geom, une table interventions avec un id_quartier en clef étrangère.
Tu pourrais d'abord faire une function qui te retourne le nombre d'interventions avec comme paramètre le id_quartier et le id_intervention :

Code:

CREATE OR REPLACE FUNCTION tonschema.nb_interventions_quartiers(id_quartier integer, id_intervention integer)
  RETURNS integer AS
$BODY$
--fonction permettant de renvoyer le nbre d'interventions d'un certain type par quartier 

  DECLARE
  nb_intervention integer;
  BEGIN
    SELECT count(*) INTO  nb_intervention 
        FROM mavueintervention v
        WHERE v.id_quartier = id_quartier  AND v.id_intervention = id_intervention ;
        
    IF nb_intervention IS NULL THEN nb_intervention = 0;

    return nb_intervention;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tonschema.nb_interventions_quartiers(integer, integer) OWNER TO postgres;

Ensuite tu utilises cette fonction dans une requête  :
12 = le id de vol
13 = le id de accident
etc...

Code:

SELECT 
q.id_quartier as gid, 
tonschema.nb_interventions_quartiers(q.id_quartier, 12) as nb_vols, 
tonschema.nb_interventions_quartiers(q.id_quartier, 13) as nb_accidents,
...etc...,
q.the_geom
FROM matablequartiers q

Tous les champs sont à adapter à ta base bien sûr, mais tu as le principe. ça devrait fonctionner..., enfin j'espère.
A noter qu'à la place d'une fonction tu pourrais faire des sous requêtes mais c'est plus lourd et pas simple de gérer le zéro si = null.
Mais je fais peut-être une usine à gaz là où qq'un aurait une solution plus simple
Tiens nous au courant

Hors ligne

 

#5 Thu 30 August 2012 10:07

Loudo
Juste Inscrit !
Lieu: Morges
Date d'inscription: 28 Aug 2012
Messages: 7

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour,

Merci de votre réponse.

Voici le code de création de ma vue initiale. la geom correspond à un point par quartier.

Code:

CREATE OR REPLACE VIEW lgr_test.vw_idp_inter_quartier AS 
 SELECT DISTINCT i.id AS gid, c.npa, c.valeur AS commune_valeur, r.numero_rue_cant, r.numero_rue_comm, r.texte_rue, r.texte_abrege_rue, r.texte_index_rue, a.numero_maison, q.gid AS id_quartier, q.nom_quartier, i.type_domaine, td.type AS type_domaine_valeur, i.id_type_intervention, ti.valeur AS type_intervention, i.no_brigade, i.date_intervention, i.jour_semaine, i.periode_jour, pj.periode AS periode_jour_valeur, i.nbr_arrest_personne, i.nbr_auteurs, i.nbr_garde_vue, i.nbr_cellule_rgp, i.nbr_cellule_jud, st_pointonsurface(q.the_geom) AS the_geom
   FROM lgr_test.mg_idp_intervention i, lgr_test.vw_cad_dom_numero_maison a, lgr_test.vw_cad_dom_rue r, mg_cad_test.mg_cad_dom_commune c, lgr_test.mg_idp_quartier q, lgr_test.mg_idp_dom_type_int ti, lgr_test.mg_idp_dom_type_domaine td, lgr_test.mg_idp_dom_periode_jour pj
  WHERE a.numero_maison::text = i.numero_maison::text AND i.numero_rue_comm::double precision = r.numero_rue_comm AND a.numero_rue_comm = r.numero_rue_comm AND st_within(a.the_geom, q.the_geom) AND ti.id = i.id_type_intervention AND td.id = i.type_domaine AND pj.id = i.periode_jour;

j'ai testé la déclaration de function et il me retourne l'erreur " ERREUR:  erreur de syntaxe sur ou près de « ; »
LINE 14:   END;"

Je n'ai jamais réalisé de fonction donc difficile à analyser.

Hors ligne

 

#6 Thu 30 August 2012 10:38

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

Re: [Postgis] Création d'une vue avec un count par colonne

je reprends ma fonction, il manquait un END IF;
Je suppose que l'erreur vient de là.

Code:

CREATE OR REPLACE FUNCTION tonschema.nb_interventions_quartiers(id_quartier integer, id_intervention integer)
  RETURNS integer AS
$BODY$
--fonction permettant de renvoyer le nbre d'interventions d'un certain type par quartier 

  DECLARE
  nb_intervention integer;
  BEGIN
    SELECT count(*) INTO  nb_intervention 
        FROM mavueintervention v
        WHERE v.id_quartier = id_quartier  AND v.id_intervention = id_intervention ;
        
    IF nb_intervention IS NULL THEN nb_intervention = 0;
    END IF;
    return nb_intervention;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tonschema.nb_interventions_quartiers(integer, integer) OWNER TO postgres;

Hors ligne

 

#7 Thu 30 August 2012 10:43

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour,

Si je comprends bien, vous voulez faire une transposition de table, ou un pivot.
Il existe un module de postgresql pour cela: tablefunc.

Des indices peut etre dans ce thread: http://georezo.net/forum/viewtopic.php?id=78297

Nicolas

Hors ligne

 

#8 Thu 30 August 2012 10:44

Loudo
Juste Inscrit !
Lieu: Morges
Date d'inscription: 28 Aug 2012
Messages: 7

Re: [Postgis] Création d'une vue avec un count par colonne

Oui exactement, mais un autre problème survient quand je fais un select sur ma fonction.

il me retourne le message suivant:

ERREUR:  la référence à la colonne « id_quartier » est ambigu
LINE 2:         WHERE v.id_quartier = id_quartier AND v.id_type_inte...
                                      ^
DETAIL:  Cela pourrait faire référence à une variable PL/pgsql ou à la colonne d'une
table.
QUERY:  SELECT count(*)                                FROM lgr_test.vw_idp_inter_quartier v
        WHERE v.id_quartier = id_quartier AND v.id_type_intervention = id_type_intervention
CONTEXT:  fonction PL/pgsql « nb_interventions_quartiers_test », ligne 4 à instruction SQL

********** Error **********

ERREUR: la référence à la colonne « id_quartier » est ambigu
SQL state: 42702
Detail: Cela pourrait faire référence à une variable PL/pgsql ou à la colonne d'une
table.
Context: fonction PL/pgsql « nb_interventions_quartiers_test », ligne 4 à instruction SQL

Hors ligne

 

#9 Thu 30 August 2012 10:51

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

Re: [Postgis] Création d'une vue avec un count par colonne

il faut probablement donner un nom différent entre la variable de paramètre de la fonction et le nom du champ de la table.
Ne pas oublier de changer le nom de la variable pris en paramètre lors de son usage dans la function (dans le WHERE)
par exemple comme ça :

Code:

CREATE OR REPLACE FUNCTION tonschema.nb_interventions_quartiers(id_quart integer, id_interv integer)

  RETURNS integer AS
$BODY$
--fonction permettant de renvoyer le nbre d'interventions d'un certain type par quartier 

  DECLARE
  nb_intervention integer;
  BEGIN
    SELECT count(*) INTO  nb_intervention 
        FROM mavueintervention v
        WHERE v.id_quartier = id_quart  AND v.id_intervention = id_interv ;
        
    IF nb_intervention IS NULL THEN nb_intervention = 0;
    END IF;
    return nb_intervention;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tonschema.nb_interventions_quartiers(integer, integer) OWNER TO postgres;

Hors ligne

 

#10 Thu 30 August 2012 12:35

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour,

pour faire ce que cherche Loudo, à partir d'une table contenant 2 colonnes (id_zone et type_inter ayant pour valeur a, b ou c) je fais comme cela :

Code:

SELECT  id_zone, 
    sum(CASE WHEN type_inter = 'A' THEN 1 ELSE 0 END) AS A, 
    sum(CASE WHEN type_inter = 'B' THEN 1 ELSE 0 END) AS B, 
    sum(CASE WHEN type_inter = 'C' THEN 1 ELSE 0 END) AS C
FROM temp.test_police
GROUP BY id_zone;

Merci Nicolas pour le module tablefunc, je ne connaissais pas.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#11 Thu 30 August 2012 15:46

Delu
Participant actif
Lieu: Briançon
Date d'inscription: 29 Apr 2008
Messages: 76

Re: [Postgis] Création d'une vue avec un count par colonne

Merci Mathieu pour cette syntaxe sql que je ne connaissais pas.
Je ne savais pas qu'il était possible de mettre des conditions directement dans une requête select.

Hors ligne

 

#12 Mon 21 July 2014 09:40

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour à tous,

pour suivi, de quoi simplifier la chose dans PostrgeSQL 9.4 :

https://wiki.postgresql.org/wiki/What%2 … TER_clause


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#13 Mon 21 July 2014 18:49

diophamidou
Participant assidu
Date d'inscription: 18 Jan 2006
Messages: 243

Re: [Postgis] Création d'une vue avec un count par colonne

Il me semble qu'il existe une fonction postgres qui permet de faire pivoter les données : extension tablefunc combinée avec la fonction crosstab
voir ce lien http://www.postgresql.org/docs/9.1/stat … efunc.html

Dernière modification par diophamidou (Mon 21 July 2014 18:55)

Hors ligne

 

#14 Tue 22 July 2014 12:28

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: [Postgis] Création d'une vue avec un count par colonne

Bonjour, oui tout à fait.
Les deux approches sont assez complémentaires à mon sens, en fonction de la complexité du lot de données qui peut nécessiter ou non l'utilisation peu triviale de l'extension tablefunc.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

Pied de page des forums

Powered by FluxBB