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

MS SQL Server Discussion :

Concatener plusieurs valeurs d'un champ dans un autre


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Concatener plusieurs valeurs d'un champ dans un autre
    Bonjour Voici une requête SQL :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select VENTES_ENT.VEN_ID,VENTES_ENT.VEN_DATE_CDE,CLI_NOM,VENTES_ENT.VEN_COMM,ART_LIBELLE1
    from VENTES_ENT,VENTES_DET,CLIENTS,FICHES_ARTICLES,STOCK_ENT
    where VENTES_ENT.VEN_ID=VENTES_DET.VEN_ENT_ID
    and
    VENTES_ENT.VEN_CLIENT=CLI_CODE
    and 
    VENTES_DET.ENT_ID=STOCK_ENT.ENT_ID
    and
    STOCK_ENT.ART_CODE=FICHES_ARTICLES.ART_CODE
    and VENTES_ENT.VEN_STATUT='A'
    group by VENTES_ENT.VEN_ID,VENTES_ENT.VEN_DATE_CDE,CLI_NOM,VENTES_ENT.VEN_COMM,ART_LIBELLE1;
    go


    qui donne :



    je souhaiterais concatener le champ ART_LIBELLE1 pour avoir dans un même champ par exemple pour la ligne 1 :

    BARDIERE VPF,CARRES S/OS VPF

    est-ce posssible ?
    merci de votre aide

  2. #2
    Expert éminent
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- TRANSFOMER EN LISTE PLUSIEURS LIGNES AVEC UN ID
    DECLARE @tab TABLE (id INT, val CHAR(1)) ; INSERT @tab (id, val) VALUES ( 1, 'a') , ( 1, 'b') , ( 1, '2' ) , ( 2, 'x' ) , ( 2, 'Z' )
    ; with SR as ( SELECT id, val FROM @tab )
    SELECT DISTINCT SR3.id , SUBSTRING(SR2.ligne, 5, LEN(SR2.ligne)-9) AS ligne
    FROM SR AS SR3
    CROSS APPLY ( select replace(cast((select val as [*] from SR WHERE SR3.id = SR.id ORDER by val FOR XML PATH('tr'), TYPE) AS VARCHAR(MAX)), '</tr><tr>', ', ' ) ligne ) AS SR2
    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é.

  3. #3
    Rédacteur

    Ou en utilisant la fonction STRING_AGG, bien plus rapide, mais SQL Server 2017....

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Expert éminent
    Citation Envoyé par SQLpro Voir le message
    Ou en utilisant la fonction STRING_AGG, bien plus rapide, mais SQL Server 2017....
    Merci je l'avais oublié celle-là

    Merci au BOL pour ce bel exemple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT STRING_AGG (FirstName, CHAR(13)) AS csv 
    FROM Person.Person;
     
    Msg 9829, Level 16, State 1, Line 6
    STRING_AGG aggregation result exceeded the limit of 8000 bytes. Use LOB types to avoid result truncation.
    https://docs.microsoft.com/en-us/sql...ql-server-2017
    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
    Rédacteur

    Ben oui, il faut contretyper (CAST) en VARCHATR(max)…. !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Expert éminent
    Citation Envoyé par SQLpro Voir le message
    Ben oui, il faut contretyper (CAST) en VARCHATR(max)…. !
    J'avais compris le workaround mais c'est fort regrettable que ça ne soit pas indiqué dans le BOL avec justement un exemple qui marche...
    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é.

###raw>template_hook.ano_emploi###