IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

concaténation d'une colonne


Sujet :

MS SQL Server

  1. #1
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut concaténation d'une colonne
    bonjour

    j'ai une requete qui devrait me retourner un truc du type

    1 aa
    1 bb
    1 cc
    2 ii
    2 ff

    et je voudrais

    1 aa bb cc
    2 ii ff

    (avec d'ailleurs des sauts de lignes entre chaque valeur à concaténer)

    dans les agrégation possibles je trouve ca dommage qu'il n'y ait pas un truc de concaténation

    et donc y a t il un moyen autre de le faire ?

    merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    sql serveur 2000 ou 2005 ? Avec 2005, sql pro utilise les CTE recursive.
    Avec 2000, il n'y a pas de solution propre, vous pouvez écrire une fonction.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    Vous pouvez utiliser une fonction avec comme parametre le premier champs

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    je suis sous 2005

    écrire une fonction oui, j'aurais su faire, mais ça m'embête d'écrire 50 fonctions pour toutes les fois ou je vais en avoir besoin

    pour les cte, j'ai regardé un peu ce que donne with, mais je comprends pas trop comment l'utiliser

    je me suis fait un jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    create table toto (a int, b varchar(10))
    insert into toto values (1,'aa')
    insert into toto values (2,'bb')
    insert into toto values (2,'cc')
    insert into toto values (1,'dd')
    y me reste plus qu'à trouver le with qui va bien

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'ai réussi à écrire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH recur    (a,b) AS
         (SELECT to1.a, cast('' as varchar(8000))       FROM   toto to1 inner join toto to2 on to1.a = to2.a 
    		union all 
    	  select toto.a,toto.b + ',' + recur.b from toto inner join recur on toto.a = recur.a )
     
     
    SELECT *
    FROM   recur

    mais ca plante en disant qu'il y a trop de récursivité, comment y mettre fin quand j'ai traité toutes les données ?
    (dans ma vraie table, j'ai une clé unique)

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    desole, je n'ai pas le temps de resoudre proprement ton probleme mais sql pro t'a mache le travail dans cet article.

    http://sqlpro.developpez.com/cours/s...recursives/#LX

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    mouais ...

    c'est vachement illisible par rapport à une fonction quand même

    est-ce plus rapide au moins ?

    et est-ce lisible une fois qu'on a compris le truc ?
    (enfin je comprends comment c'est traité, donc je peux pas arriver à le lire)

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    Dans une fonction, tu es quasiment oblige de passer par un curseur ce qui represente la plus mauvaise option en matiere d'acces.

    si tu utilises les fonctions recursives, si tu as sql serveur 2005, tu gagneras du temps à écrire car c'est assez compact.

    evidemment, c'est un peu complexe à comprendre, mais tu gagneras en competences sur les fonctionnalités de 2005.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    c'est vachement illisible par rapport à une fonction quand même
    C'est simplement que vous vous êtes habitué à écrire du code itératif et n'avez pas l'habitude d'écrire du code ensembliste (requêtes).
    Or le code ensembliste (requête), sera pas nature toujours plus rapide que l'itératif (fonction, procédure).

    Autrement dit, faites des efforts (et le ciel t'aidera !)

    A +

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonsoir,

    Une possibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TOTO1.a,
           (
    		SELECT TOTO2.b + ','
    		FROM dbo.TOTO TOTO2
    		WHERE TOTO2.a = TOTO1.a
    		ORDER BY TOTO2.b
    		FOR XML PATH('')
    	) AS b
    FROM dbo.TOTO TOTO1
    GROUP BY TOTO1.a
    Pour les sauts de ligne, vous pouvez remplacer la virgule par CHAR(10) (saut de ligne) et/ou CHAR(13) (retour chariot).

    Pour les CTE, il y a quelques années j'étais comme vous, parce que je jonglais entre Java et SQL Server.
    Au début j'ai trouvé ça curieux mais très pratique, et maintenant je trouve le code itératif, comme dans un curseur, vraiment naze, surtout quand on connaît les performances d'un curseur

  11. #11
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Une autre possibilité avec une CTE :

    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
    17
    18
    19
    20
    21
    22
    23
    WITH CTE(a, liste, b, lgr) AS
    (
    		SELECT a,
    			CAST('' AS VARCHAR(MAX)) liste,
    			CAST('' AS VARCHAR(MAX)) b,
    			0 lgr
    		FROM dbo.TOTO
    		GROUP BY a
    	UNION ALL
    		SELECT TOTO.a a,
    				CAST(liste + CASE WHEN lgr = 0 THEN '' ELSE ', ' END + TOTO.b AS VARCHAR(MAX)) liste,
    				CAST(TOTO.b AS VARCHAR(MAX)) b,
    				lgr + 1 lgr
    		FROM CTE
    		JOIN dbo.TOTO TOTO ON CTE.a = TOTO.a
    		WHERE TOTO.b > CTE.b
    )
    SELECT a, liste
    FROM (
    		SELECT a, liste, RANK() OVER (PARTITION BY a ORDER BY lgr DESC) rang
    		FROM CTE
    	) D
    WHERE rang = 1

Discussions similaires

  1. [XL-2010] Concaténer toute une colonne Excel vers une ligne Word
    Par elwy07 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 13/02/2015, 19h38
  2. [9i]Concaténation d'une colonne
    Par gigigao dans le forum SQL
    Réponses: 10
    Dernier message: 18/09/2007, 15h34
  3. concaténer sur toute une colonne
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/12/2006, 14h20
  4. Concaténer toutes les lignes d'une colonne
    Par metalcoyote dans le forum Oracle
    Réponses: 6
    Dernier message: 10/05/2006, 15h51
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo