Message posté par : Mathieu Denat
----------------------------------------
Bonjour,
Les données en entrée sont au format pgsql ou travaillez vous avec une couche virtuelle?
En complément des réponses précédentes, voici une petite suggestion d'amélioration sur
le premier script.
C'est très personnel, mais je préfère utilser des CTE (l'usage de WITH, permet de
faire des "requêtes combinées" pour nettoyer les données).
Il peut y avoir plusieurs sources d'erreurs, notamment le fait de comparer du texte
alors que vos données sont des chiffres.
Voici une proposition d'amélioration:
-----------------
Code :
/* pour info sur le SQL
on note les commentaires entre */
-- ou avec -- pour ignorer du -- jusqu'en fin de ligne
--création d'un jeu de données "propre"
with tmp as (
select
--nettoyage du champ Surf15
--coalesce permet de remplacer les valeurs nulles par ce qu'on veut (ici 0)
coalesce(<champ>,<résutat souhaité>))
coalesce(
--nullif permet de remplacer la valeur xxx parce qu'on veut (ici null)
nullif(<champ>,<valeur à remplacer par null>)
nullif(
"Surf15",''
)
,'0')
--::int permet de convertir le texte en nombre (essayer ::real si ça n'est pas du
pgsql)
::numeric
--on spécifie le nom du champ en miniscules, histoire de s'embêter pour la suite
as surf15,
--nettoyage du champ Surf18
coalesce(nullif("Surf18",''),'0')::numeric as surf18,
* --on récupère les autres champs si besoin, si plein de champs inutiles, prévoir de
récupérer uniquement un identifiant unique pour faire une jointure serait peut-être plus
from couche
)
select
CASE
WHEN surf18 = surf15 THEN 'surface stable'
WHEN surf18 > surf15 THEN 'surface en progression' --coalesce remplace la
valeur nulle par 0. nullif remplace la valeur '' par NULL
WHEN surf15 > surf18 THEN 'surface en régression'
WHEN surf18 = 0 AND surf15 > 0 THEN 'surface supprimée en 2018'
WHEN surf15 = 0 AND surf18 > 0 THEN 'surface créee en 2018'
ELSE NULL --permet de voir les éventuels enregistrement ne répondant à aucune condition
ci-dessus. Pratique pour voir les erreurs! Normalement il devrait pas y en avoir
END evolution,
* -- autres champs si nécessaires.
from tmp
-----------------
Pour appliquer le case when uniquement en fonction de certains champs j'ajouterai une
clause where, ex avec tout le blabla du dessus:
with [...]
from tmp
where "A"='3'
Bienvenu dans le mon merveilleux du SQL! :)
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=354387#p354387
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net