Besoin d'une requete SQL ou procédure MySQL pour obtenir des données aggregées

Fermé
Dydy225 Messages postés 5 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 15 mai 2019 - 13 mai 2019 à 19:22
Dydy225 Messages postés 5 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 15 mai 2019 - 15 mai 2019 à 21:26
Bonsoir Famille CCM !

Je souhaiterais avoir votre aide sur une requete (ou une procédure stockée) qui pourrait agréger des résultats de différentes colonnes en une seule ligne. Je m'explique, j'ai une série d'enregistrement dans ma table (voir fichier joint, feuille DONNEES) je voudrais avoir des résultats agrégés (voir feuille RESULTAT SOUHAITE).
Ainsi Pour chaque lignes la requete devra retourner la colonne CODE (Colonne B dans le fichier Excel), ensuite agréger les valeurs des colonnes GPE A à GPE G (Colonnes F à L dans le fichier Excel). De sorte que pour les lignes où le même code se répète (par exemple de B2 à B5 dans le fichier Excel) on ait une seule ligne renseignée à partir des informations fournie à la date la plus ancienne (Colonne E du fichier Excel).
Les colonnes A, C, D et E de la feuille DONNEES ne sont pas nécessaires dans le résultat

Exemple: pour aabbc02020400101 qui se répète (de B2 à B5 dans le fichier Excel) la requete doit retourner une seule ligne avec les valeurs suivantes
GPE A :VIDE, GPE B: N, GPE C: N, GPE D: VIDE, GPE E: N, GPE F :N, GPE G:A
qui sont les premières valeurs renseignées pour chaque item (colonnes GPE) de la date la plus ancienne à la plus récente (voire cellule en jaune)

Merci d'avance ! :-)

le fichier Excel est disponible ici : https://www.cjoint.com/c/IEnroLuPmcq

1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 15 mai 2019 à 10:20
Bonjour,

Il y a peut-être mieux à faire, mais ceci devrait fonctionner. Je rajouterais aussi que n'ayant pas de moteur MySQL sous la main, et vu que ce n'est pas mon SGBD de prédilection, il peut y avoir quelques ajustements à faire.

WITH
    gpeA AS (SELECT t.code, t.gpe_a FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_A <> '' GROUP BY code) a
        ON t.code = a.code AND t.id_acti = a.id_acti),
        
    gpeB AS (SELECT t.code, t.gpe_b FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_B <> '' GROUP BY code) b
        ON t.code = b.code AND t.id_acti = b.id_acti),
        
    gpeC AS (SELECT t.code, t.gpe_c FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_C <> '' GROUP BY code) c
        ON t.code = c.code AND t.id_acti = c.id_acti),
        
    gpeD AS (SELECT t.code, t.gpe_d FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_D <> '' GROUP BY code) d
        ON t.code = d.code AND t.id_acti = d.id_acti),
        
    gpeE AS (SELECT t.code, t.gpe_e FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_E <> '' GROUP BY code) e
        ON t.code = e.code AND t.id_acti = e.id_acti),
        
    gpeF AS (SELECT t.code, t.gpe_f FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_F <> '' GROUP BY code) f
        ON t.code = f.code AND t.id_acti = f.id_acti),
        
    gpeG AS (SELECT t.code, t.gpe_g FROM ma_table t INNER JOIN
        (SELECT code, min(id_acti) as id_acti FROM ma_table WHERE GPE_G <> '' GROUP BY code) g
        ON t.code = g.code AND t.id_acti = g.id_acti)

SELECT DISTINCT t.code, t.C_ID, t.type_a_id, COALESCE(gpeA.gpe_a, '') as gpe_a, COALESCE(gpeB.gpe_b, '') as gpe_b,
       COALESCE(gpeC.gpe_c, '') as gpe_c, COALESCE(gpeD.gpe_d, '') as gpe_d, COALESCE(gpeE.gpe_e, '') as gpe_e,
       COALESCE(gpeF.gpe_f, '') as gpe_f, COALESCE(gpeG.gpe_g, '') as gpe_g
FROM ma_table t
LEFT OUTER JOIN gpeA ON gpeA.code = t.code
LEFT OUTER JOIN gpeB ON gpeB.code = t.code
LEFT OUTER JOIN gpeC ON gpeC.code = t.code
LEFT OUTER JOIN gpeD ON gpeD.code = t.code
LEFT OUTER JOIN gpeE ON gpeE.code = t.code
LEFT OUTER JOIN gpeF ON gpeF.code = t.code
LEFT OUTER JOIN gpeG ON gpeG.code = t.code


J'ai voulu le faire en une seule requête. Tu dois sans doute pouvoir créer une fonction qui retourne la valeur pour un couple code/colonne donné, en construisant une requête dynamiquement, ça simplifierait largement cette écriture mais je ne connais pas assez MySQL.

Xavier
0
Dydy225 Messages postés 5 Date d'inscription vendredi 3 mai 2019 Statut Membre Dernière intervention 15 mai 2019
15 mai 2019 à 21:26
Merci beaucoup. Je teste et je vous reviens
0