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 plusieurs lignes en une seule


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 30
    Points : 27
    Points
    27
    Par défaut Concat plusieurs lignes en une seule
    Bonjour,

    J'ai la table suivante

    ----------------
    Uid | Alias |
    --------------- |
    1 | Pierre |
    1 | Patrick |
    1 | Jean |
    2 | Alice |
    2 | Diana |

    et je veux l'afficher de cette manière


    ------------------------|
    Uid | Alias |
    ------------------------|
    1 | Pierre Patrick Jean|
    2 | Alice Diana |

    Est-ce possible ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 780
    Points
    52 780
    Billets dans le blog
    5
    Par défaut
    Ou par une requête récursive :

    Le jeu de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE suivante (Uid INT, Alias VARCHAR(32));
    GO
    INSERT INTO suivante 
    VALUES (1, 'Pierre'), (1, 'Patrick'), (1, 'Jean'), (2, 'Alice'), (2, 'Diana');
    GO
    la requête :

    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
    WITH 
    T0 AS
    (
    SELECT Uid, Alias, ROW_NUMBER() OVER(PARTITION BY Uid ORDER BY Alias) AS N,
                ROW_NUMBER() OVER(PARTITION BY Uid ORDER BY Alias DESC) AS P
    FROM   suivante
    ), 
    T1 AS
    (SELECT Uid, CAST(Alias AS VARCHAR(max)) AS AllAlias, N, P, 1 AS Q
     FROM   T0
     UNION ALL
     SELECT T0.Uid, T1.AllAlias + ', '+ T0.Alias, T0.N, T0.P, Q + 1
     FROM   T1
            INNER JOIN T0
    		      ON T1.Uid = T0.Uid
    			     AND T1.N = T0.N-1)
    SELECT * FROM T1 WHERE N = Q AND P = 1
    Sans doute de meilleures perf qu'avec le XML !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Le plus rapide restera une fonction d'aggregation CLR...
    C'est d'ailleurs l'exemple MSDN...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    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 : 42
    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,

    Pour avoir testé la concaténation par CTE récursive et en utilisant FOR XML PATH (''), je peux dire qu'il n'y a pas photo en termes de performance : la seconde possibilité est de loin la plus rapide, sur des volumes de données importants

    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
    DECLARE @t TABLE
    (
    	uid tinyint
    	, alias varchar(8)
    )
     
    INSERT INTO @t
    VALUES (1, 'Pierre')
    , (1, 'Patrick')
    , (1, 'Jean')
    , (2, 'Alice')
    , (2, 'Diana')
     
     
    SELECT		DISTINCT T.uid
    		, C.alias_list	
    FROM		@t AS T
    CROSS APPLY	(
    			SELECT	alias + ' '
    			FROM	@t AS S
    			WHERE	S.uid = T.uid
    			FOR	XML PATH('')
    		) AS C(alias_list)
    En revanche je serai curieux d'effectuer la comparaison avec une fonction CLR

    @++

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    + 1 pour XML pour des gros volumes de données. L'utilisation de la CTE récursive force l'exécution ligne à ligne.

    ++

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    J'ai pour ma part pu tester la fonction d'aggregation CLR pour de la génération d'URL (url rewriting) à partir de templates sur environ 200000 lignes... c'est vraiment FAST...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Regrouper données plusieurs ligne en une seule
    Par willytito dans le forum Access
    Réponses: 2
    Dernier message: 03/09/2007, 10h35
  2. Plusieurs lignes dans une seule
    Par rlnd23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2007, 16h35
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. Réponses: 4
    Dernier message: 07/09/2006, 12h12
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 13h55

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