Skip to main content

Indicateurs délinquance

On cherche à construire une base de données qui renvoie une ligne pour chaque commune et qui nous permet d'avoir un indicateur de la délinquance sur chaque type de crimes sauf homicides tout en nous permettant de connaitre la significativité de la différence entre l'indicateur obtenu à l'échelle communale et celui qu'on obtient à l'échelle départementale ou encore l'échelle régionale. 

Choix de la base de données : 

Bases statistiques communale, départementale et régionale de la délinquance enregistrée par la police et la gendarmerie nationales. Cette base de données se structure par communes en ayant une ligne pour chaque infraction pour chaque commune avec comme liste d'infractions : 

Infraction commise Abréviation Unité de compte
Violences Physiques Intrafamiliales sur personnes de 15 ans ou plus VPI Victime
Violences Physiques Hors Cadre Familial sur personnes de 15 ans ou plus VPHCF Victime
Violences sexuelles VS Victime
Vols avec armes (armes à feu, armes blanches ou par destination) VAA Infraction
Vols violents sans arme VVSA Infraction

Vols sans violence contre des personnes

VSVCP Victime entendue
Cambriolages de logements CL Infraction

Vols de véhicules

VV Véhicule
Vols dans les véhicules VDV Véhicule
Vols d'accessoires sur véhicules VAV Véhicule
Destructions et dégradations volontaires DDV Infraction
Usage de stupéfiants US Mis en cause
Usage de stupéfiants dont amendes forfaitaires délictuelles (AFD) USAFD Mis en cause
Trafic de stupéfiants TS Mis en cause
Escroqueries et fraudes aux moyens de paiement EFMP Victime

Pour obtenir le choix on va d'abord définir le nom des colonnes

Identifiant Commune codgeo
Identifiant Departement coddep
Identifiant région codreg

Identifiant crime échelle communale

i_"Abreviation de l'infraction en minuscule"_com
Identifiant crime échelle départementale i_"Abreviation de l'infraction en minuscule"_dep
Identifiant crime échelle régionale i_"Abreviation de l'infraction en minuscule"_reg
Significativité crime entre commune et département i_sign_"Abréviation de l'infraction en minuscule"_com_dep
Significativité crime entre commune et région i_sign_"Abréviation de l'infraction en minuscule"_com_reg
Significativité crime entre département et région i_sign_"Abréviation de l'infraction en minuscule"_dep_reg
Fiabilité des données sur le crime à l'échelle communale ( y'a t'il une donnée manquante sur une année, au quel cas on a pris la moyenne départementale sur cette année )  i_"Abréviation de l'infraction en minuscule"_com_fiabilite

Pour obtenir ces colonnes on va donc traiter la base de données via PGadmin dans lequel on va effectuer deux requetes, tout d'abord on va effectuer une première requette qu'on appellera i_deli_nat : 

DROP TABLE IF EXISTS i_deli_nat;

CREATE TABLE i_deli_nat AS
WITH 

-- 1. Nettoyage hyper-sécurisé de la base
base_clean AS (
    SELECT 
        codgeo_2025 AS codgeo,
        LEFT(codgeo_2025, 2) AS coddep,
        annee,
        indicateur,
        
        -- Nettoyage de insee_pop
        CASE 
            WHEN TRIM(insee_pop) IN ('', 'NA', 'N/A', 'NULL', 'error') OR insee_pop IS NULL THEN NULL 
            ELSE REPLACE(insee_pop, ',', '.')::numeric 
        END AS insee_pop,
        
        -- Nettoyage de taux_pour_mille et application de la règle
        CASE 
            WHEN TRIM(taux_pour_mille) IN ('', 'NA', 'N/A', 'NULL', 'error') OR taux_pour_mille IS NULL THEN 
                CASE 
                    WHEN TRIM(complement_info_taux) IN ('', 'NA', 'N/A', 'NULL', 'error') OR complement_info_taux IS NULL THEN NULL
                    ELSE REPLACE(complement_info_taux, ',', '.')::numeric 
                END
            ELSE REPLACE(taux_pour_mille, ',', '.')::numeric 
        END AS taux_retenu,
        
        -- Règle : Fiabilité
        CASE 
            WHEN TRIM(taux_pour_mille) IN ('', 'NA', 'N/A', 'NULL', 'error') OR taux_pour_mille IS NULL THEN false 
            ELSE true 
        END AS est_fiable,
        
        -- Préparation pour le département
        CASE 
            WHEN TRIM(complement_info_taux) IN ('', 'NA', 'N/A', 'NULL', 'error') OR complement_info_taux IS NULL THEN NULL
            ELSE REPLACE(complement_info_taux, ',', '.')::numeric 
        END AS comp_taux_num
    FROM delinquance_nat
),

-- 2. Moyenne par COMMUNE
stats_com AS (
    SELECT 
        codgeo,
        coddep,
        indicateur,
        AVG(taux_retenu) AS i_com,
        AVG(insee_pop) AS pop_com,
        BOOL_AND(est_fiable) AS i_com_fiabilite
    FROM base_clean
    GROUP BY codgeo, coddep, indicateur
),

-- 3. Valeurs pour le DEPARTEMENT
premiere_valeur_dep AS (
    SELECT DISTINCT ON (coddep, indicateur, annee) 
        coddep, indicateur, annee, comp_taux_num
    FROM base_clean
    WHERE comp_taux_num IS NOT NULL
    ORDER BY coddep, indicateur, annee, codgeo
),
stats_dep AS (
    SELECT 
        c.coddep,
        c.indicateur,
        COALESCE(
            AVG(p.comp_taux_num), 
            AVG(c.taux_retenu)    
        ) AS i_dep
    FROM base_clean c
    LEFT JOIN premiere_valeur_dep p 
        ON c.coddep = p.coddep AND c.indicateur = p.indicateur AND c.annee = p.annee
    GROUP BY c.coddep, c.indicateur
),

-- 4. Jointure et nettoyage population dep/reg (au cas où il y ait des 'NA' ici aussi)
stats_dep_enrichies AS (
    SELECT 
        sd.coddep,
        sd.indicateur,
        sd.i_dep,
        pd.codreg,
        CASE 
            WHEN TRIM(pd.ptot::text) IN ('', 'NA', 'N/A', 'NULL', 'error') OR pd.ptot IS NULL THEN NULL 
            ELSE REPLACE(pd.ptot::text, ',', '.')::numeric 
        END AS pop_dep,
        CASE 
            WHEN TRIM(pd.ptotreg::text) IN ('', 'NA', 'N/A', 'NULL', 'error') OR pd.ptotreg IS NULL THEN NULL 
            ELSE REPLACE(pd.ptotreg::text, ',', '.')::numeric 
        END AS pop_reg
    FROM stats_dep sd
    JOIN pop_dep pd ON sd.coddep = pd.coddep
),

-- 5. Moyenne par REGION
stats_reg AS (
    SELECT 
        codreg,
        indicateur,
        AVG(i_dep) AS i_reg
    FROM stats_dep_enrichies
    GROUP BY codreg, indicateur
)

-- 6. ASSEMBLAGE FINAL ET CALCULS DE SIGNIFICATIVITE
SELECT 
    sc.codgeo,
    sc.coddep,
    sde.codreg,
    sc.indicateur,
    sc.i_com,
    sde.i_dep,
    sr.i_reg,
    sc.i_com_fiabilite,
    
    -- Z-Score Com vs Dep
    CASE 
        WHEN (sc.i_com/1000) = (sde.i_dep/1000) THEN 'non significatif'
        WHEN ABS((sc.i_com/1000) - (sde.i_dep/1000)) / NULLIF(SQRT(
            ((sde.i_dep/1000) * (1 - (sde.i_dep/1000)) / NULLIF(sc.pop_com, 0)) + 
            ((sde.i_dep/1000) * (1 - (sde.i_dep/1000)) / NULLIF(sde.pop_dep, 0))
        ), 0) > 1.96 
        THEN 
            CASE WHEN sc.i_com > sde.i_dep THEN 'significativement plus haut' ELSE 'significativement plus bas' END
        ELSE 'non significatif'
    END AS sign_com_dep,

    -- Z-Score Com vs Reg
    CASE 
        WHEN (sc.i_com/1000) = (sr.i_reg/1000) THEN 'non significatif'
        WHEN ABS((sc.i_com/1000) - (sr.i_reg/1000)) / NULLIF(SQRT(
            ((sr.i_reg/1000) * (1 - (sr.i_reg/1000)) / NULLIF(sc.pop_com, 0)) + 
            ((sr.i_reg/1000) * (1 - (sr.i_reg/1000)) / NULLIF(sde.pop_reg, 0))
        ), 0) > 1.96 
        THEN 
            CASE WHEN sc.i_com > sr.i_reg THEN 'significativement plus haut' ELSE 'significativement plus bas' END
        ELSE 'non significatif'
    END AS sign_com_reg,

    -- Z-Score Dep vs Reg
    CASE 
        WHEN (sde.i_dep/1000) = (sr.i_reg/1000) THEN 'non significatif'
        WHEN ABS((sde.i_dep/1000) - (sr.i_reg/1000)) / NULLIF(SQRT(
            ((sr.i_reg/1000) * (1 - (sr.i_reg/1000)) / NULLIF(sde.pop_dep, 0)) + 
            ((sr.i_reg/1000) * (1 - (sr.i_reg/1000)) / NULLIF(sde.pop_reg, 0))
        ), 0) > 1.96 
        THEN 
            CASE WHEN sde.i_dep > sr.i_reg THEN 'significativement plus haut' ELSE 'significativement plus bas' END
        ELSE 'non significatif'
    END AS sign_dep_reg

FROM stats_com sc
JOIN stats_dep_enrichies sde ON sc.coddep = sde.coddep AND sc.indicateur = sde.indicateur
JOIN stats_reg sr ON sde.codreg = sr.codreg AND sc.indicateur = sr.indicateur;

Cette première requete permet de créer les indicateurs que l'on va calculer, elle est déjà exploitable mais chaque ligne représente une infraction par commune, on ne peut donc pas utiliser cette dernière pour obtenir la table que l'on recherche. 

Pour cela on va donc effectuer une deuxième requete : 

DROP TABLE IF EXISTS I_Deli_TX;

CREATE TABLE I_Deli_TX AS
SELECT 
    codgeo, 
    coddep, 
    codreg,

    -- 1. Violences physiques intrafamiliales (VPI)
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN i_com END) AS I_VPI_Com,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN i_dep END) AS I_VPI_Dep,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN i_reg END) AS I_VPI_Reg,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN sign_com_dep END) AS I_Sign_VPI_Com_Dep,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN sign_com_reg END) AS I_Sign_VPI_Com_Reg,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN sign_dep_reg END) AS I_Sign_VPI_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Violences physiques intrafamiliales' THEN i_com_fiabilite ELSE true END) AS I_VPI_Com_Fiabilite,

    -- 2. Violences physiques hors cadre familial (VPHCF)
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN i_com END) AS I_VPHCF_Com,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN i_dep END) AS I_VPHCF_Dep,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN i_reg END) AS I_VPHCF_Reg,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN sign_com_dep END) AS I_Sign_VPHCF_Com_Dep,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN sign_com_reg END) AS I_Sign_VPHCF_Com_Reg,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN sign_dep_reg END) AS I_Sign_VPHCF_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Violences physiques hors cadre familial' THEN i_com_fiabilite ELSE true END) AS I_VPHCF_Com_Fiabilite,

    -- 3. Violences sexuelles (VS)
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN i_com END) AS I_VS_Com,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN i_dep END) AS I_VS_Dep,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN i_reg END) AS I_VS_Reg,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN sign_com_dep END) AS I_Sign_VS_Com_Dep,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN sign_com_reg END) AS I_Sign_VS_Com_Reg,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' THEN sign_dep_reg END) AS I_Sign_VS_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Violences sexuelles' THEN i_com_fiabilite ELSE true END) AS I_VS_Com_Fiabilite,

    -- 4. Vols avec armes (VAA)
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN i_com END) AS I_VAA_Com,
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN i_dep END) AS I_VAA_Dep,
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN i_reg END) AS I_VAA_Reg,
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN sign_com_dep END) AS I_Sign_VAA_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN sign_com_reg END) AS I_Sign_VAA_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols avec armes' THEN sign_dep_reg END) AS I_Sign_VAA_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols avec armes' THEN i_com_fiabilite ELSE true END) AS I_VAA_Com_Fiabilite,

    -- 5. Vols violents sans arme (VVSA)
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN i_com END) AS I_VVSA_Com,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN i_dep END) AS I_VVSA_Dep,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN i_reg END) AS I_VVSA_Reg,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN sign_com_dep END) AS I_Sign_VVSA_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN sign_com_reg END) AS I_Sign_VVSA_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' THEN sign_dep_reg END) AS I_Sign_VVSA_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols violents sans arme' THEN i_com_fiabilite ELSE true END) AS I_VVSA_Com_Fiabilite,

    -- 6. Vols sans violence contre des personnes (VSVCP)
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN i_com END) AS I_VSVCP_Com,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN i_dep END) AS I_VSVCP_Dep,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN i_reg END) AS I_VSVCP_Reg,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN sign_com_dep END) AS I_Sign_VSVCP_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN sign_com_reg END) AS I_Sign_VSVCP_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN sign_dep_reg END) AS I_Sign_VSVCP_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols sans violence contre des personnes' THEN i_com_fiabilite ELSE true END) AS I_VSVCP_Com_Fiabilite,

    -- 7. Escroqueries et fraudes aux moyens de paiement (EFMP)
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN i_com END) AS I_EFMP_Com,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN i_dep END) AS I_EFMP_Dep,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN i_reg END) AS I_EFMP_Reg,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN sign_com_dep END) AS I_Sign_EFMP_Com_Dep,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN sign_com_reg END) AS I_Sign_EFMP_Com_Reg,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN sign_dep_reg END) AS I_Sign_EFMP_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' THEN i_com_fiabilite ELSE true END) AS I_EFMP_Com_Fiabilite,

    -- 8. Cambriolages de logement (CL)
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN i_com END) AS I_CL_Com,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN i_dep END) AS I_CL_Dep,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN i_reg END) AS I_CL_Reg,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN sign_com_dep END) AS I_Sign_CL_Com_Dep,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN sign_com_reg END) AS I_Sign_CL_Com_Reg,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' THEN sign_dep_reg END) AS I_Sign_CL_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Cambriolages de logement' THEN i_com_fiabilite ELSE true END) AS I_CL_Com_Fiabilite,

    -- 9. Vols de véhicule (VV)
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN i_com END) AS I_VV_Com,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN i_dep END) AS I_VV_Dep,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN i_reg END) AS I_VV_Reg,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN sign_com_dep END) AS I_Sign_VV_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN sign_com_reg END) AS I_Sign_VV_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' THEN sign_dep_reg END) AS I_Sign_VV_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols de véhicule' THEN i_com_fiabilite ELSE true END) AS I_VV_Com_Fiabilite,

    -- 10. Vols dans les véhicules (VDV)
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN i_com END) AS I_VDV_Com,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN i_dep END) AS I_VDV_Dep,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN i_reg END) AS I_VDV_Reg,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN sign_com_dep END) AS I_Sign_VDV_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN sign_com_reg END) AS I_Sign_VDV_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' THEN sign_dep_reg END) AS I_Sign_VDV_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols dans les véhicules' THEN i_com_fiabilite ELSE true END) AS I_VDV_Com_Fiabilite,

    -- 11. Vols d'accessoires sur véhicules (VAV)
    -- Attention ici : on met deux apostrophes ('') pour dire à SQL qu'il s'agit du texte "d'accessoires" et non de la fin de la chaîne
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN i_com END) AS I_VAV_Com,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN i_dep END) AS I_VAV_Dep,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN i_reg END) AS I_VAV_Reg,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN sign_com_dep END) AS I_Sign_VAV_Com_Dep,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN sign_com_reg END) AS I_Sign_VAV_Com_Reg,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN sign_dep_reg END) AS I_Sign_VAV_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' THEN i_com_fiabilite ELSE true END) AS I_VAV_Com_Fiabilite,

    -- 12. Destructions et dégradations volontaires (DDV)
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN i_com END) AS I_DDV_Com,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN i_dep END) AS I_DDV_Dep,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN i_reg END) AS I_DDV_Reg,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN sign_com_dep END) AS I_Sign_DDV_Com_Dep,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN sign_com_reg END) AS I_Sign_DDV_Com_Reg,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN sign_dep_reg END) AS I_Sign_DDV_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Destructions et dégradations volontaires' THEN i_com_fiabilite ELSE true END) AS I_DDV_Com_Fiabilite,

    -- 13. Usage de stupéfiants (US)
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN i_com END) AS I_US_Com,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN i_dep END) AS I_US_Dep,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN i_reg END) AS I_US_Reg,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN sign_com_dep END) AS I_Sign_US_Com_Dep,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN sign_com_reg END) AS I_Sign_US_Com_Reg,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' THEN sign_dep_reg END) AS I_Sign_US_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Usage de stupéfiants' THEN i_com_fiabilite ELSE true END) AS I_US_Com_Fiabilite,

    -- 14. Usage de stupéfiants (AFD) (USAFD)
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN i_com END) AS I_USAFD_Com,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN i_dep END) AS I_USAFD_Dep,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN i_reg END) AS I_USAFD_Reg,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN sign_com_dep END) AS I_Sign_USAFD_Com_Dep,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN sign_com_reg END) AS I_Sign_USAFD_Com_Reg,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN sign_dep_reg END) AS I_Sign_USAFD_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' THEN i_com_fiabilite ELSE true END) AS I_USAFD_Com_Fiabilite,

    -- 15. Trafic de stupéfiants (TS)
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN i_com END) AS I_TS_Com,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN i_dep END) AS I_TS_Dep,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN i_reg END) AS I_TS_Reg,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN sign_com_dep END) AS I_Sign_TS_Com_Dep,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN sign_com_reg END) AS I_Sign_TS_Com_Reg,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN sign_dep_reg END) AS I_Sign_TS_Dep_Reg,
    BOOL_AND(CASE WHEN indicateur = 'Trafic de stupéfiants' THEN i_com_fiabilite ELSE true END) AS I_TS_Com_Fiabilite

FROM i_deli_nat
GROUP BY codgeo, coddep, codreg
ORDER BY codgeo;

Cette requête permet d'avoir une table où chaque ligne représente une commune et chaque colonne représente une des colonnes définies préalablement. 

NE PAS OUVRIR SANS FILTRE

Pour pouvoir exploiter cette base de données, il faut suivre un protocole, une fois que vous avez ajouté cette table à QGIS vous remarquerez qu'elle n'a pas de géométrie, c'est normal. Pour pouvoir ouvrir la table attributaire il vous faudra filtrer la table avec une requête du type 

codgeo = 'Insee_com_de_votre_commune' 

Ou alors 

coddep = 'Numéro_de_département_de_votre_commune'

Vous pourrez ensuite joindre cette table à une couche avec géométrie correspondant.

Une mise à jour existe mais est difficilement exploitable due au poids de la table  cette dernière rajoute des colonnes elle se trouve dans la colonne i_deli_tx_complete

Identifiant Commune codgeo TEXT
Identifiant Département coddep TEXT
Identifiant région codreg TEXT

Taux pour mille en fonction du crime échelle communale

i_"Abréviation de l'infraction en minuscule"_com Numeric
Taux pour mille en fonction du crime échelle départementale i_"Abréviation de l'infraction en minuscule"_dep Numeric
Taux pour mille en fonction du crime échelle régionale i_"Abréviation de l'infraction en minuscule"_reg Numeric
Significativité crime entre commune et département i_sign_"Abréviation de l'infraction en minuscule"_com_dep Numeric
Significativité crime entre commune et région i_sign_"Abréviation de l'infraction en minuscule"_com_reg Numeric
Significativité crime entre département et région i_sign_"Abréviation de l'infraction en minuscule"_dep_reg Numeric
Fiabilité des données sur le crime à l'échelle communale ( y'a t'il une donnée manquante sur une année, au quel cas on a pris la moyenne départementale sur cette année )  i_"Abréviation de l'infraction en minuscule"_com_fiabilite Boolean
Taux pour mille en fonction du crime  et de l'année (2016 ou 2024 ) échelle communale  i_"Abréviation de l'infraction en minuscule"_com_"Année sélectionnée" Numeric
Taux pour mille en fonction du crime  et de l'année (2016 ou 2024 ) échelle départementale i_"Abréviation de l'infraction en minuscule"_dep_"Année sélectionnée" Numeric
Taux pour mille en fonction du crime  et de l'année (2016 ou 2024 ) échelle régionale i_"Abréviation de l'infraction en minuscule"_reg_"Année sélectionnée" Numeric
Évolution de taux pour mille en fonction du crime entre 2016 et 2024 (2024/2016) i_"Abréviation de l'infraction en minuscule"_ratio_24_16 Numeric

Pour cela on effectue deux nouvelles requetes la première permet d'obtenir toutes les données pour les années 2016 et 2024 elle se trouve dans la base de données i_deli_tx_evol :

DROP TABLE IF EXISTS I_Deli_TX_Evol;

CREATE TABLE I_Deli_TX_Evol AS
WITH base_clean AS (
    SELECT 
        codgeo_2025 AS codgeo,
        LEFT(codgeo_2025, 2) AS coddep,
        annee,
        indicateur,
        CASE WHEN TRIM(taux_pour_mille) IN ('', 'NA', 'N/A', 'NULL', 'error') OR taux_pour_mille IS NULL THEN 
                 CASE WHEN TRIM(complement_info_taux) IN ('', 'NA', 'N/A', 'NULL', 'error') OR complement_info_taux IS NULL THEN NULL
                      ELSE REPLACE(complement_info_taux, ',', '.')::numeric END
             ELSE REPLACE(taux_pour_mille, ',', '.')::numeric END AS taux_retenu,
        CASE WHEN TRIM(complement_info_taux) IN ('', 'NA', 'N/A', 'NULL', 'error') OR complement_info_taux IS NULL THEN NULL
             ELSE REPLACE(complement_info_taux, ',', '.')::numeric END AS comp_taux_num
    -- /!\ VÉRIFIEZ BIEN QUE C'EST LE NOM DE VOTRE TABLE BRUTE ICI :
    FROM delinquance_nat 
    WHERE annee IN ('2016', '2024')
),
stats_com_yr AS (
    SELECT codgeo, coddep, indicateur, annee, AVG(taux_retenu) AS i_com_yr
    FROM base_clean GROUP BY codgeo, coddep, indicateur, annee
),
premiere_valeur_dep_yr AS (
    SELECT DISTINCT ON (coddep, indicateur, annee) coddep, indicateur, annee, comp_taux_num
    FROM base_clean WHERE comp_taux_num IS NOT NULL ORDER BY coddep, indicateur, annee, codgeo
),
stats_dep_yr AS (
    SELECT c.coddep, c.indicateur, c.annee, COALESCE(AVG(p.comp_taux_num), AVG(c.taux_retenu)) AS i_dep_yr
    FROM base_clean c
    LEFT JOIN premiere_valeur_dep_yr p ON c.coddep = p.coddep AND c.indicateur = p.indicateur AND c.annee = p.annee
    GROUP BY c.coddep, c.indicateur, c.annee
),
stats_dep_yr_enrichies AS (
    SELECT sd.coddep, sd.indicateur, sd.annee, sd.i_dep_yr, pd.codreg
    FROM stats_dep_yr sd JOIN pop_dep pd ON sd.coddep = pd.coddep
),
stats_reg_yr AS (
    SELECT codreg, indicateur, annee, AVG(i_dep_yr) AS i_reg_yr
    FROM stats_dep_yr_enrichies GROUP BY codreg, indicateur, annee
),
deli_inter_yr AS (
    SELECT sc.codgeo, sc.indicateur, sc.annee, sc.i_com_yr, sde.i_dep_yr, sr.i_reg_yr
    FROM stats_com_yr sc
    JOIN stats_dep_yr_enrichies sde ON sc.coddep = sde.coddep AND sc.indicateur = sde.indicateur AND sc.annee = sde.annee
    JOIN stats_reg_yr sr ON sde.codreg = sr.codreg AND sc.indicateur = sr.indicateur AND sc.annee = sr.annee
)

-- LE PIVOT DES 105 COLONNES
SELECT 
    codgeo,

    -- VPI (Violences physiques intrafamiliales)
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2016' THEN i_com_yr END) AS I_VPI_Com_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2016' THEN i_dep_yr END) AS I_VPI_Dep_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2016' THEN i_reg_yr END) AS I_VPI_Reg_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2024' THEN i_com_yr END) AS I_VPI_Com_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2024' THEN i_dep_yr END) AS I_VPI_Dep_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2024' THEN i_reg_yr END) AS I_VPI_Reg_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Violences physiques intrafamiliales' AND annee = '2016' THEN i_com_yr END), 0) AS I_VPI_Ratio_24_16,

    -- VPHCF (Violences physiques hors cadre familial)
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2016' THEN i_com_yr END) AS I_VPHCF_Com_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2016' THEN i_dep_yr END) AS I_VPHCF_Dep_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2016' THEN i_reg_yr END) AS I_VPHCF_Reg_2016,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2024' THEN i_com_yr END) AS I_VPHCF_Com_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2024' THEN i_dep_yr END) AS I_VPHCF_Dep_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2024' THEN i_reg_yr END) AS I_VPHCF_Reg_2024,
    MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Violences physiques hors cadre familial' AND annee = '2016' THEN i_com_yr END), 0) AS I_VPHCF_Ratio_24_16,

    -- VS (Violences sexuelles)
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2016' THEN i_com_yr END) AS I_VS_Com_2016,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2016' THEN i_dep_yr END) AS I_VS_Dep_2016,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2016' THEN i_reg_yr END) AS I_VS_Reg_2016,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2024' THEN i_com_yr END) AS I_VS_Com_2024,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2024' THEN i_dep_yr END) AS I_VS_Dep_2024,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2024' THEN i_reg_yr END) AS I_VS_Reg_2024,
    MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Violences sexuelles' AND annee = '2016' THEN i_com_yr END), 0) AS I_VS_Ratio_24_16,

    -- VAA (Vols avec armes)
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2016' THEN i_com_yr END) AS I_VAA_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2016' THEN i_dep_yr END) AS I_VAA_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2016' THEN i_reg_yr END) AS I_VAA_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2024' THEN i_com_yr END) AS I_VAA_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2024' THEN i_dep_yr END) AS I_VAA_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2024' THEN i_reg_yr END) AS I_VAA_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols avec armes' AND annee = '2016' THEN i_com_yr END), 0) AS I_VAA_Ratio_24_16,

    -- VVSA (Vols violents sans arme)
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2016' THEN i_com_yr END) AS I_VVSA_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2016' THEN i_dep_yr END) AS I_VVSA_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2016' THEN i_reg_yr END) AS I_VVSA_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2024' THEN i_com_yr END) AS I_VVSA_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2024' THEN i_dep_yr END) AS I_VVSA_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2024' THEN i_reg_yr END) AS I_VVSA_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols violents sans arme' AND annee = '2016' THEN i_com_yr END), 0) AS I_VVSA_Ratio_24_16,

    -- VSVCP (Vols sans violence contre des personnes)
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2016' THEN i_com_yr END) AS I_VSVCP_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2016' THEN i_dep_yr END) AS I_VSVCP_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2016' THEN i_reg_yr END) AS I_VSVCP_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2024' THEN i_com_yr END) AS I_VSVCP_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2024' THEN i_dep_yr END) AS I_VSVCP_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2024' THEN i_reg_yr END) AS I_VSVCP_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols sans violence contre des personnes' AND annee = '2016' THEN i_com_yr END), 0) AS I_VSVCP_Ratio_24_16,

    -- CL (Cambriolages de logement)
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2016' THEN i_com_yr END) AS I_CL_Com_2016,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2016' THEN i_dep_yr END) AS I_CL_Dep_2016,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2016' THEN i_reg_yr END) AS I_CL_Reg_2016,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2024' THEN i_com_yr END) AS I_CL_Com_2024,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2024' THEN i_dep_yr END) AS I_CL_Dep_2024,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2024' THEN i_reg_yr END) AS I_CL_Reg_2024,
    MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Cambriolages de logement' AND annee = '2016' THEN i_com_yr END), 0) AS I_CL_Ratio_24_16,

    -- VV (Vols de véhicule)
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2016' THEN i_com_yr END) AS I_VV_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2016' THEN i_dep_yr END) AS I_VV_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2016' THEN i_reg_yr END) AS I_VV_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2024' THEN i_com_yr END) AS I_VV_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2024' THEN i_dep_yr END) AS I_VV_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2024' THEN i_reg_yr END) AS I_VV_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols de véhicule' AND annee = '2016' THEN i_com_yr END), 0) AS I_VV_Ratio_24_16,

    -- VDV (Vols dans les véhicules)
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2016' THEN i_com_yr END) AS I_VDV_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2016' THEN i_dep_yr END) AS I_VDV_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2016' THEN i_reg_yr END) AS I_VDV_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2024' THEN i_com_yr END) AS I_VDV_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2024' THEN i_dep_yr END) AS I_VDV_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2024' THEN i_reg_yr END) AS I_VDV_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols dans les véhicules' AND annee = '2016' THEN i_com_yr END), 0) AS I_VDV_Ratio_24_16,

    -- VAV (Vols d'accessoires sur véhicules)
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2016' THEN i_com_yr END) AS I_VAV_Com_2016,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2016' THEN i_dep_yr END) AS I_VAV_Dep_2016,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2016' THEN i_reg_yr END) AS I_VAV_Reg_2016,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2024' THEN i_com_yr END) AS I_VAV_Com_2024,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2024' THEN i_dep_yr END) AS I_VAV_Dep_2024,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2024' THEN i_reg_yr END) AS I_VAV_Reg_2024,
    MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Vols d''accessoires sur véhicules' AND annee = '2016' THEN i_com_yr END), 0) AS I_VAV_Ratio_24_16,

    -- DDV (Destructions et dégradations volontaires)
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2016' THEN i_com_yr END) AS I_DDV_Com_2016,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2016' THEN i_dep_yr END) AS I_DDV_Dep_2016,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2016' THEN i_reg_yr END) AS I_DDV_Reg_2016,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2024' THEN i_com_yr END) AS I_DDV_Com_2024,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2024' THEN i_dep_yr END) AS I_DDV_Dep_2024,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2024' THEN i_reg_yr END) AS I_DDV_Reg_2024,
    MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Destructions et dégradations volontaires' AND annee = '2016' THEN i_com_yr END), 0) AS I_DDV_Ratio_24_16,

    -- US (Usage de stupéfiants)
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2016' THEN i_com_yr END) AS I_US_Com_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2016' THEN i_dep_yr END) AS I_US_Dep_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2016' THEN i_reg_yr END) AS I_US_Reg_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2024' THEN i_com_yr END) AS I_US_Com_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2024' THEN i_dep_yr END) AS I_US_Dep_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2024' THEN i_reg_yr END) AS I_US_Reg_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Usage de stupéfiants' AND annee = '2016' THEN i_com_yr END), 0) AS I_US_Ratio_24_16,

    -- USAFD (Usage de stupéfiants (AFD))
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2016' THEN i_com_yr END) AS I_USAFD_Com_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2016' THEN i_dep_yr END) AS I_USAFD_Dep_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2016' THEN i_reg_yr END) AS I_USAFD_Reg_2016,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2024' THEN i_com_yr END) AS I_USAFD_Com_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2024' THEN i_dep_yr END) AS I_USAFD_Dep_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2024' THEN i_reg_yr END) AS I_USAFD_Reg_2024,
    MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Usage de stupéfiants (AFD)' AND annee = '2016' THEN i_com_yr END), 0) AS I_USAFD_Ratio_24_16,

    -- TS (Trafic de stupéfiants)
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2016' THEN i_com_yr END) AS I_TS_Com_2016,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2016' THEN i_dep_yr END) AS I_TS_Dep_2016,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2016' THEN i_reg_yr END) AS I_TS_Reg_2016,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2024' THEN i_com_yr END) AS I_TS_Com_2024,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2024' THEN i_dep_yr END) AS I_TS_Dep_2024,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2024' THEN i_reg_yr END) AS I_TS_Reg_2024,
    MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Trafic de stupéfiants' AND annee = '2016' THEN i_com_yr END), 0) AS I_TS_Ratio_24_16,

    -- EFMP (Escroqueries et fraudes aux moyens de paiement)
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2016' THEN i_com_yr END) AS I_EFMP_Com_2016,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2016' THEN i_dep_yr END) AS I_EFMP_Dep_2016,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2016' THEN i_reg_yr END) AS I_EFMP_Reg_2016,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2024' THEN i_com_yr END) AS I_EFMP_Com_2024,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2024' THEN i_dep_yr END) AS I_EFMP_Dep_2024,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2024' THEN i_reg_yr END) AS I_EFMP_Reg_2024,
    MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2024' THEN i_com_yr END) / NULLIF(MAX(CASE WHEN indicateur = 'Escroqueries et fraudes aux moyens de paiement' AND annee = '2016' THEN i_com_yr END), 0) AS I_EFMP_Ratio_24_16

FROM deli_inter_yr
GROUP BY codgeo;
Cette base de données est lisible mais NE PAS OUVRIR SANS FILTRAGE PRÉALABLE les bases de données de ce fichier sont trop grosses elle feront planter SYSTÉMATIQUEMENT Qgis.
Filtrer de la même manière que au préalable.

Ensuite on effectue une dernière manipulation pour obtenir une base de données conjointe  qui s'appelle i_deli_tx_complete

DROP TABLE IF EXISTS I_Deli_TX_Complete;

CREATE TABLE I_Deli_TX_Complete AS
SELECT 
    t1.*, 
    -- On rajoute toutes les colonnes de l'annexe sauf "codgeo" pour éviter les doublons
    t2.I_VPI_Com_2016, t2.I_VPI_Dep_2016, t2.I_VPI_Reg_2016, t2.I_VPI_Com_2024, t2.I_VPI_Dep_2024, t2.I_VPI_Reg_2024, t2.I_VPI_Ratio_24_16,
    t2.I_VPHCF_Com_2016, t2.I_VPHCF_Dep_2016, t2.I_VPHCF_Reg_2016, t2.I_VPHCF_Com_2024, t2.I_VPHCF_Dep_2024, t2.I_VPHCF_Reg_2024, t2.I_VPHCF_Ratio_24_16,
    t2.I_VS_Com_2016, t2.I_VS_Dep_2016, t2.I_VS_Reg_2016, t2.I_VS_Com_2024, t2.I_VS_Dep_2024, t2.I_VS_Reg_2024, t2.I_VS_Ratio_24_16,
    t2.I_VAA_Com_2016, t2.I_VAA_Dep_2016, t2.I_VAA_Reg_2016, t2.I_VAA_Com_2024, t2.I_VAA_Dep_2024, t2.I_VAA_Reg_2024, t2.I_VAA_Ratio_24_16,
    t2.I_VVSA_Com_2016, t2.I_VVSA_Dep_2016, t2.I_VVSA_Reg_2016, t2.I_VVSA_Com_2024, t2.I_VVSA_Dep_2024, t2.I_VVSA_Reg_2024, t2.I_VVSA_Ratio_24_16,
    t2.I_VSVCP_Com_2016, t2.I_VSVCP_Dep_2016, t2.I_VSVCP_Reg_2016, t2.I_VSVCP_Com_2024, t2.I_VSVCP_Dep_2024, t2.I_VSVCP_Reg_2024, t2.I_VSVCP_Ratio_24_16,
    t2.I_CL_Com_2016, t2.I_CL_Dep_2016, t2.I_CL_Reg_2016, t2.I_CL_Com_2024, t2.I_CL_Dep_2024, t2.I_CL_Reg_2024, t2.I_CL_Ratio_24_16,
    t2.I_VV_Com_2016, t2.I_VV_Dep_2016, t2.I_VV_Reg_2016, t2.I_VV_Com_2024, t2.I_VV_Dep_2024, t2.I_VV_Reg_2024, t2.I_VV_Ratio_24_16,
    t2.I_VDV_Com_2016, t2.I_VDV_Dep_2016, t2.I_VDV_Reg_2016, t2.I_VDV_Com_2024, t2.I_VDV_Dep_2024, t2.I_VDV_Reg_2024, t2.I_VDV_Ratio_24_16,
    t2.I_VAV_Com_2016, t2.I_VAV_Dep_2016, t2.I_VAV_Reg_2016, t2.I_VAV_Com_2024, t2.I_VAV_Dep_2024, t2.I_VAV_Reg_2024, t2.I_VAV_Ratio_24_16,
    t2.I_DDV_Com_2016, t2.I_DDV_Dep_2016, t2.I_DDV_Reg_2016, t2.I_DDV_Com_2024, t2.I_DDV_Dep_2024, t2.I_DDV_Reg_2024, t2.I_DDV_Ratio_24_16,
    t2.I_US_Com_2016, t2.I_US_Dep_2016, t2.I_US_Reg_2016, t2.I_US_Com_2024, t2.I_US_Dep_2024, t2.I_US_Reg_2024, t2.I_US_Ratio_24_16,
    t2.I_USAFD_Com_2016, t2.I_USAFD_Dep_2016, t2.I_USAFD_Reg_2016, t2.I_USAFD_Com_2024, t2.I_USAFD_Dep_2024, t2.I_USAFD_Reg_2024, t2.I_USAFD_Ratio_24_16,
    t2.I_TS_Com_2016, t2.I_TS_Dep_2016, t2.I_TS_Reg_2016, t2.I_TS_Com_2024, t2.I_TS_Dep_2024, t2.I_TS_Reg_2024, t2.I_TS_Ratio_24_16,
    t2.I_EFMP_Com_2016, t2.I_EFMP_Dep_2016, t2.I_EFMP_Reg_2016, t2.I_EFMP_Com_2024, t2.I_EFMP_Dep_2024, t2.I_EFMP_Reg_2024, t2.I_EFMP_Ratio_24_16
FROM I_Deli_TX t1
LEFT JOIN I_Deli_TX_Evol t2 ON t1.codgeo = t2.codgeo;

NE JAMAIS OUVRIR CA PLANTE AUTOMATIQUEMENT. 

La base de données fait 250 colonnes pour 34000 lignes elle est absolument impossible à ouvrir. De manière générale elle n'est ouvrable et gérable que sur une seule commune pour ouvrir la table attributaire.