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)
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)
)
une table exploitation
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 )
)
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
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 )
)
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
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;
Je cherche à récupérer l'évolution (par exemple annuelle) des surfaces d'exploitation pour un type d'exploitation donné.

J'arrive à obtenir la surface pour un type d'exploitation donné et à une date donnée à l'aide de la requête :
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
;
Mais est il possible d'obtenir un résultat du type

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)