Bonjour à tous
Je vous expose mon problème, j'ai 3 tables :
une table parcelle (qui à priori n'est pas nécessaire dans mon problème)
une table exploitation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 CREATE TABLE parcelle ( idparcelle character(20) NOT NULL, numeropar character(10), numerosection character(5), surface numeric(15,4), codeinsee character(5) NOT NULL, idclimat integer NOT NULL, the_geomparcelle geometry, idqgis serial NOT NULL, CONSTRAINT idqgis_pkey PRIMARY KEY (idqgis ), CONSTRAINT enforce_dims_the_geomparcelle CHECK (st_ndims(the_geomparcelle) = 2), CONSTRAINT enforce_geotype_the_geomparcelle CHECK (geometrytype(the_geomparcelle) = 'MULTIPOLYGON'::text OR the_geomparcelle IS NULL), CONSTRAINT enforce_srid_the_geomparcelle CHECK (st_srid(the_geomparcelle) = 2154) )
et une table concerneexploit qui fait le lien entre ces deux tables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE exploitation ( idexploit bigint NOT NULL, nomexploit character(100), CONSTRAINT exploitation_pkey PRIMARY KEY (idexploit ) )
Pour obtenir les intervalles de date j'ai utilisé une vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE concerneexploit ( idexploit bigint NOT NULL, idparcelle character(20) NOT NULL, dateexploit date NOT NULL, surfaceexploit numeric(15,4), CONSTRAINT concerneexploit_pkey PRIMARY KEY (idexploit , idparcelle , dateexploit ) )
Je cherche à récupérer l'évolution (par exemple annuelle) des surfaces d'exploitation pour un type d'exploitation donné.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CREATE OR REPLACE VIEW intervalle_exploit_surf AS SELECT t1.idexploit, t1.idparcelle, t1.dateexploit AS datedebut, COALESCE(min(t2.dateexploit) - 1, '9999-12-31'::date) AS datefin, sum(t1.surfaceexploit) AS surfaceexploit FROM concerneexploit t1 LEFT JOIN concerneexploit t2 ON t1.idparcelle = t2.idparcelle AND t1.idexploit = t2.idexploit AND t2.dateexploit > t1.dateexploit GROUP BY t1.idparcelle, t1.idexploit, t1.dateexploit;
J'arrive à obtenir la surface pour un type d'exploitation donné et à une date donnée à l'aide de la requête :
Mais est il possible d'obtenir un résultat du type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT SUM(c.surfaceexploit) FROM intervalle_exploit_surf c JOIN exploitation e ON c.idexploit = e.idexploit WHERE e.nomexploit = 'Vigne' AND '1952-01-01' BETWEEN c.datedebut AND c.datefin ;
Année Surface
1950 100
1951 200
1952 200
1953 124
etc
Je me dis que je pourrais toujours le faire par programmation en lançant des requêtes successives mais j'aurai voulu savoir si c'était possible directement en SQL, ou si mon modèle de données ne me permet pas de la faire.
J'espère que mon explication est compréhensible, n'hésitez pas à me demander des précisions
En vous remerciant
Ludovic
PS : j'utilise postgresql (pour le cas où cela ait une importance)
Partager