Bonjour à tous,
je dispose d'un dump SQL d'une base de licences sportives fédérales qui contient, pour ce qui m'intéresse ici, une table licences. Cette table contient toutes les licences prises depuis 2010 jusqu'à aujourd'hui. La table contient entre autre 3 colonnes utiles pour mon propos. Une colonne saison qui indique la saison sportive de la prise de licence (2010, 2011,....2021), une colonne comportant les "code_adherent" et une colonne primo indiquant par 1 ou 0 si le licencié est un primo adhérent. Malheureusement cette colonne n'est renseignée que pour la saison 2021 mais pas pour les plus anciennes.
Je me propose donc de mettre à jour cette colonne sur ma copie locale afin d'identifier saison par saison les primo-adhérents et les renouvellements de licence à des fins statistiques.
voilà comment j'ai pensé résoudre mon problème:
1. Faire de toutes les licences prises en 2010 des primo-licences puisqu'il n'y a pas de saison antérieure (la valeur par défaut de 2010 à 2020 est 0).
2. Mettre à jour la colonne primo pour la saison suivante en cherchant si les" code_adherent" en 2011 existent pour la saison 2010. Si c'est le cas ce sont des renouvellements sinon des primo-licences.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /* set primo saison 2010 default 1 */ UPDATE licences set primo = 1 WHERE saison = 2010;
3. ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /* set primo saison 2011 */ UPDATE licences set primo = 1 where saison = 2011 and code_adherent in (SELECT code_adherent from licences l2 where saison = 2011 and code_adherent not in (SELECT code_adherent FROM licences l WHERE saison = 2010)) ;
et ainsi jusqu'à 2020
Ma première question est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 /* set primo saison 2020 */ UPDATE licences set primo = 1 where saison = 2020 and code_adherent in (SELECT code_adherent from licences l2 where saison = 2020 and code_adherent not in (SELECT code_adherent FROM licences l WHERE saison = 2010 or saison = 2011 or saison = 2012 or saison = 2013 or saison = 2014 or saison = 2015 or saison = 2016 or saison = 2017 or saison = 2018 or saison = 2019)) ;
La démarche est-elle correcte ? i.e. Est-ce qu'elle fait bien ce que je veux faire.
Et éventuellement, y a-t-il une manière plus élégante et plus économe en code de faire la même chose ?
Ma deuxième question concerne un problème lié à la saison 2021 dont le champ primo est déjà renseigné.
si j'effectue la requête suivante pour déterminer le nombre de renouvellements en 2021:
j'obtiens 9126 licences qui existent déjà de 2010 à 2020 et 6935 primo licenciés en substituant au IN de ma requête NOT IN.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT count(code_adherent) from licences l2 where saison = 2021 and code_adherent in (SELECT code_adherent FROM licences l WHERE saison = 2010 or saison = 2011 or saison = 2012 or saison = 2013 or saison = 2014 or saison = 2015 or saison = 2016 or saison = 2017 or saison = 2018 or saison = 2019 or saison = 2020);
si maintenant je vérifie sur la base
j'obtiens respectivement 9101 et 6960 sot une différence de 25 (25 renouvellements en moins qui basculent en primo). Le total restant le même. Il y a donc une erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select primo, count(primo) from licences l where saison = 2021 group by primo;
Comment donc identifier les licences (code_adherent ) concernées ?
Merci d'avance pour vos réponses
Partager