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

Développement SQL Server Discussion :

Regrouper plusieurs lignes en une seule


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Regrouper plusieurs lignes en une seule
    Bonjour,

    J'ai dans ma base 3 tables:

    ARTICLE
    - Code (clé)
    - CC (clé)
    - Lib1
    - Lib2

    NOMENC
    - Code (clé)
    - CC (clé)
    - COMP
    - COMP_CC
    - LIB_COMP

    LIBELLE
    - Code (clé)
    - CC (clé)
    - LIBEL_COMPL

    Pour un article d'ARTICLE,, je peux avoir plusieurs lignes dans LIBELLE et plusieurs lignes dans NOMENC

    Via une seule requête, je voudrais pouvoir avoir concaténé dans une même ligne:
    ARTICLE.CODE, ARTICLE.CC, NOMENC.COMP1, NOMENC.COMP_CC1, NOMENC.LIB_COMP1, NOMENC.COMP2, NOMENC.COMP_CC2, NOMENC.LIB_COMP2, ..., LIBELLE.LIBEL_COMPL1, LIBELLE.LIBEL_COMPL2...

    Est-ce réalisable? J'ai cherché du côté de XML PATH, GROUP_CONCAT, mais sans succès.

    Merci d'avance,
    Xavier

  2. #2
    Expert éminent sénior
    bonjour,

    essayez STRING_AGG(), GROUP_CONCATc'est pour MySQL

  3. #3
    Membre éclairé
    Bonjour,

    STRING_AGG() n'est pas reconnu
    Xavier

  4. #4
    Expert éminent
    ça serait bien de fournir ta version de sql server alors

    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  5. #5
    Modérateur

    @7gyY9w1ZY6ySRgPeaefZ, la release majeure est spécifiée dans le sujet

    @Asdorve, jetez un coup d'œil à FOR XML PATH, ça fonctionne sur SQL-Server 2008.

  6. #6
    Membre éclairé
    Citation Envoyé par Waldar Voir le message


    @Asdorve, jetez un coup d'œil à FOR XML PATH, ça fonctionne sur SQL-Server 2008.
    Je l'ai fait, mais sans succès
    Xavier

  7. #7
    Modérateur

    Je n'avais pas bien lu votre besoin, vous cherchez un PIVOT plutôt non ?
    N'hésitez pas à fournir quelques lignes de vos tables pour illustrer.

  8. #8
    Membre éclairé
    ARTICLE
    - Code (clé) : AAAA
    - CC (clé) : 1234
    - Lib1 : Ma description 1
    - Lib2 : Ma description 2

    NOMENC
    - Code (clé) : AAAA
    - CC (clé) : 1234
    - COMP : COMPOSANT1
    - LIB_COMP : Description Composant 1

    - Code (clé) : AAAA
    - CC (clé) : 1234
    - COMP : COMPOSANT2
    - LIB_COMP : Description Composant 2

    LIBELLE
    - Code (clé) : COMPOSANT1
    - LIBEL_COMPL : dispo en stock

    - Code (clé) : COMPOSANT2
    - LIBEL_COMPL : existe en rouge uniquement

    Pour obtenir :
    AAAA, 1234, Ma description 1, Ma description 2, COMPOSANT1, dispo en stock, COMPOSANT2, existe uniquement en rouge
    Xavier

  9. #9
    Modérateur

    Essayez ainsi :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    with cte_NOMENC (Code, CC, COMP, LIB_COMP, rn) as
    (
    select Code, CC, COMP, LIB_COMP
         , row_number() over(partition by Code, CC order by COMP asc)
      from NOMENC
    )
      select art.Code, art.CC, art.Lib1, art.Lib2
           , max(case nom.rn when 1 then nom.COMP        end) as COMP_1
           , max(case nom.rn when 1 then lib.LIBEL_COMPL end) as LIB_1
           , max(case nom.rn when 2 then nom.COMP        end) as COMP_2
           , max(case nom.rn when 2 then lib.LIBEL_COMPL end) as LIB_2
        from ARTICLE    as art
        join cte_NOMENC as nom  on nom.Code = art.Code
                               and nom.CC   = art.CC
        join LIBELLE    as lib  on lib.Code = nom.COMP
    group by art.Code, art.CC, art.Lib1, art.Lib2;

###raw>template_hook.ano_emploi###