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

Dydy225 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
Dydy225 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

1 réponse

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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   Statut Membre Dernière intervention  
 
Merci beaucoup. Je teste et je vous reviens
0