République
Française
Documentation Datafoncier
Toutes les ressources sur les données foncières
Bien démarrer avec DV3F
Pour déterminer la surface moyenne du terrain d'une maison en excluant les maisons aux terrains atypiques dans le département du Nord (59) :
SELECT avg(sterr)
FROM dvf.mutation
WHERE coddep = '59'
AND codtypbien = '111%'
AND (filtre NOT LIKE '%M%' OR filtre NOT LIKE '%1%') -- le filtre '5' est nécessairement inclus dans le '1'
AND sterr > 0;
Pour pré-repérer les ventes de maisons destinées à la démolition pour de la construction dense dans le département du Nord (59) :
SELECT *
FROM dvf.mutation
WHERE coddep = '59'
AND codtypbien = '111%'
AND devenir LIKE 'CD-O';
Pour lister les ventes de logement de particulier à particulier (en vue d'analyser les prix) en 2014 dans le département du Nord (59):
SELECT *
FROM dvf.mutation
WHERE coddep = '59'
AND anneemut = 2014
AND (codtypbien LIKE '11%' OR codtypbien LIKE '12%')
AND filtre = '0'
AND devenir = 'S'
AND codtypprov = 'X0' AND codtypproa = 'X0';
Une piste pour repérer les ventes de terrains nus pour la construction de logements sociaux en 2012 dans le département du Nord (59):
SELECT *
FROM dvf.mutation
WHERE coddep = '59'
AND anneemut = 2012
AND codtypbien LIKE '2%'
AND (filtre = 'S' OR filtre = 'HS') -- ventes à 0 ou 1 euro retenues
Pour lister des ventes de terrains nus à bâtir (en vue d'analyser les prix) dans le département du Nord (59):
SELECT *
FROM dvf.mutation
WHERE coddep = '59'
AND codtypbien LIKE '2%'
AND (segmtab > 2) -- on impose un critère restrictif de sélection des TAB
AND filtre = '0'
Pour lister des ventes de terrains nus naturels, agricoles ou forestiers (en vue d'analyser les prix) dans le département du Nord (59):
SELECT *
FROM dvf.mutation
WHERE coddep = '59'
AND codtypbien LIKE '2%'
AND segmtab IS NULL -- on exclut un maximum de terrain pré-supposés TAB
AND filtre = '0'
Depuis la version 9.4 de PostgreSQL, une fonction, permettant notamment le calcul de la médiane, est disponible : percentile_disc
Cette fonction reste complexe. Il est vous est proposé trois fonctions ci-dessous qui peuvent être utilisées à la place de percentile_disc ou pour les versions antérieures à la 9.4. Ces fonctions (dvf.mediane, dvf.premier_quartile et dvf.dernier_quartile) sont à créer une seule fois (pour la base de données) puis reste utilisable par la suite.
Nota : Ces fonctions doivent être présentes pour l'utilisation du module InDVF.
CREATE OR REPLACE FUNCTION dvf.centile(anyarray, integer)
RETURNS anyelement AS
$BODY$
SELECT t[$2/100.0 * array_upper($1,1) + 0.5] FROM (SELECT ARRAY(SELECT unnest($1) ORDER BY 1) as t) t1;
$BODY$
LANGUAGE sql;
CREATE OR REPLACE FUNCTION dvf.mediane_0(anyarray)
RETURNS anyelement AS
$BODY$
SELECT dvf.centile($1, 50);
$BODY$
LANGUAGE sql;
CREATE OR REPLACE FUNCTION dvf.premier_quartile_0(anyarray)
RETURNS anyelement AS
$BODY$
SELECT dvf.centile($1, 25);
$BODY$
LANGUAGE sql;
CREATE OR REPLACE FUNCTION dvf.dernier_quartile_0(anyarray)
RETURNS anyelement AS
$BODY$
SELECT dvf.centile($1, 75);
$BODY$
LANGUAGE sql;
DROP AGGREGATE IF EXISTS dvf.mediane(NUMERIC);
CREATE aggregate dvf.mediane(NUMERIC)
(
sfunc = array_append,
stype = NUMERIC[],
finalfunc = dvf.mediane_0
);
DROP AGGREGATE IF EXISTS dvf. premier_quartile(NUMERIC);
CREATE aggregate dvf.premier_quartile(NUMERIC)
(
sfunc = array_append,
stype = NUMERIC[],
finalfunc = dvf.premier_quartile_0
);
DROP AGGREGATE IF EXISTS dvf.dernier_quartile(NUMERIC);
CREATE aggregate dvf.dernier_quartile(NUMERIC)
(
sfunc = array_append,
stype = NUMERIC[],
finalfunc = dvf.dernier_quartile_0
);
Si l'on souhaite travailler en euros constants, il est également possible d'ajouter un champ valeurfonc_euro_cst qui permet de corriger directement chacune des valeurs foncières par rapport à l'année de référence souhaitée.
Par exemple, pour ramener les valeurs des mutations par rapport à l'année 2010:
SELECT
*,
-- valeur foncière en euros constants 2010
CASE
WHEN anneemut = 2005 THEN round(valeurfonc/0.928, 2)
WHEN anneemut = 2006 THEN round(valeurfonc/0.943, 2)
WHEN anneemut = 2007 THEN round(valeurfonc/0.957, 2)
WHEN anneemut = 2008 THEN round(valeurfonc/0.984, 2)
WHEN anneemut = 2009 THEN round(valeurfonc/0.985, 2)
WHEN anneemut = 2010 THEN round(valeurfonc/1, 2)
WHEN anneemut = 2011 THEN round(valeurfonc/1.021, 2)
WHEN anneemut = 2012 THEN round(valeurfonc/1.041, 2)
WHEN anneemut = 2013 THEN round(valeurfonc/1.050, 2)
WHEN anneemut = 2014 THEN round(valeurfonc/1.056, 2)
ELSE valeurfonc
END AS valeurfonc_euro_cst
FROM dvf.mutation;
Pour déterminer le prix médian d'une maison vendue par un promoteur en 2014 dans le département du Nord (59):
SELECT count(*) AS nombre_de_ventes, dvf.mediane(valeurfonc) as prix_median
FROM dvf.mutation
WHERE coddep = '59'
AND anneemut = 2014
AND codtypbien LIKE '111%'
AND filtre = '0'
AND devenir = 'S'
AND (codtypprov LIKE '%F6%' OR rolev = 'Op');
Pour déterminer le prix au m2 médian d'un appartement ancien T3 en 2014 dans le département du Nord (59):
SELECT count(*) AS nombre_de_ventes, round(dvf.mediane(valeurfonc/sbati), 2) as prix_median
FROM dvf.mutation
WHERE coddep = '59'
AND anneemut = 2014
AND codtypbien = '12133'
AND filtre = '0'
AND devenir = 'S'
AND sbati > 0;
Pour déterminer le prix au m2 médian de terrains nus viticoles dans le département de la Gironde (33) entre 2012 et 2014 :
SELECT count(*) AS nombre_de_ventes, round(dvf.mediane(valeurfonc/sterr), 2) as prix_median
FROM dvf.mutation
WHERE coddep = '33'
AND anneemut > 2011 AND anneemut < 2015
AND codtypbien = '2311'
AND segmtab IS NULL -- on exclut un maximum de terrain pré-supposés TAB
AND filtre = '0'
AND sterr > 0;
Pour déterminer le prix au m2 médian d'un terrain à bâtir vendu entre particulier pour de la construction 'diffuse' entre 2012 et 2014 dans le département du Loiret (45):
SELECT count(*) AS nombre_de_ventes, round(dvf.mediane(valeurfonc/sterr), 2) as prix_median
FROM dvf.mutation
WHERE coddep = '45'
AND anneemut > 2011 AND anneemut < 2015
AND codtypbien LIKE '2%'
AND segmtab > 2
AND filtre = '0'
AND devenir LIKE 'C-D%'
AND codtypprov = 'X0' AND codtypproa = 'X0';
AND sterr > 0;