Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Regrouper plusieurs lignes en une seule


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Regrouper plusieurs lignes en une seule
    Bonjour à tous,

    J'ai une BDD avec


    [TH]DATE[/TH]
    [TH]NOM[/TH]
    [TH]NUMERO[/TH]
    10-08-2020 Pierre 10
    10-08-2020 Paul 12
    10-08-2020 Isabelle 14
    11-08-2020 Pierre 7
    11-08-2020 Paul 8
    11-08-2020 Isabelle 9
    12-08-2020 Pierre 1
    12-08-2020 Paul 2
    12-08-2020 Isabelle 3

    Je voudrai faire une requête qui renvoie cela :


    [TH]DATE[/TH]
    [TH]PIERRE[/TH]
    [TH]PAUL[/TH]
    [TH]ISABELLE[/TH]
    10-08-2020 10 12 14
    11-08-2020 7 8 9
    12-08-2020 1 2 3

    Est ce possible de faire cela facilement en SQL ?

    Merci d'avance pour vos lumières

  2. #2
    Membre éclairé
    Bonjour,

    C'est un pivot que tu souhaites faire. Par contre je ne comprends pas les résultats des valeurs pivotées. Pourquoi par exemple Paul et Isabelle ont des valeurs pour le 10-08-2020 alors qu'ils n'en ont que pour le 11-08-2020 et 12-08-2020 respectivement?

  3. #3
    Candidat au Club
    Pierre, Paul et Isabelle ont systématiquement une valeur tous les jours

  4. #4
    Membre éclairé
    Bonjour,

    Es tu sûr que tu ne t'es pas trompé dans ton tableau initial? Les 3 premières lignes sont toutes au 10/08, les 3 suivantes toutes au 11/08 et les 3 dernières au 12/08?

  5. #5
    Candidat au Club
    Oui je suis sur. C'est justement mon problème,. Je veux fusionner les données pour n'avoir qu'une date par ligne. Pour cela, la valeur donnée par ligne doit être affectée au nom qui passerait en colonne.

  6. #6
    Membre éclairé
    Oui j'ai bien compris, mais dans tes données de départ:


    [TH]DATE[/TH]
    [TH]NOM[/TH]
    [TH]NUMERO[/TH]
    10-08-2020 Pierre 10
    11-08-2020 Paul 12
    12-08-2020 Isabelle 14
    10-08-2020 Pierre 7
    11-08-2020 Paul 8
    12-08-2020 Isabelle 9
    10-08-2020 Pierre 1
    11-08-2020 Paul 2
    12-08-2020 Isabelle 3

    Pierre n'a pas de numéro ni le 11/08 et ni le 12/08. Donc d'où sort pour Pierre la valeur 7 le 11/08 et la valeur 1 pour le 12/08 dans ton tableau de sortie? Ces valeurs sont au 10/08 pour Pierre. Comment décides tu de mettre 7 pour le 11/08 et 1 pour le 12/08, et pas l'inverse? Impossible à faire sans critères plus sélectifs.

  7. #7
    Candidat au Club
    Il y avait une erreur effectivement dans le tableau ! (peut être dû à l'édition en tableau réalisé ou peut être dû aux données initiales).

    Bref, j'ai repris le message initial et le tableau devrait être bon.

    On a bien des données pour chaque date pour chacun des personnages. L'idée est de regrouper en une ligne chaque date avec la valeur de chaque personnage en colonne..

  8. #8
    Membre éclairé
    Ok c'est plus logique. Si ta base de données le gère, tu peux utiliser la fonctionnalité PIVOT:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
    from t
    pivot (max(numero) for nom in ('Pierre' as PIERRE, 'Paul' as PAUL, 'Isabelle' as ISABELLE))
    order by 1;


    A noter qu'il faut connaitre les valeurs à pivoter, donc si tu as un nombre de personnages illimité, ça ne fonctionnera pas.

  9. #9
    Candidat au Club
    Et non malheureusement, je n'ai pas accès à la fonction PIVOT…

  10. #10
    Membre éclairé
    Dans ce cas tu peux faire un pivot à l'ancienne:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select date,
           max(case when nom = 'Pierre' then numero end) as PIERRE,
           max(case when nom = 'Paul' then numero end) as PAUL,
           max(case when nom = 'Isabelle' then numero end) as ISABELLE
    from t
    group by date
    order by 1;

  11. #11
    Candidat au Club
    Ca fonctionne parfaitement ! Merci !

###raw>template_hook.ano_emploi###