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

Développement SQL Server Discussion :

Concaténer une colonne


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut Concaténer une colonne
    Bonjour,

    J'ai un problème délicat à résoudre.
    Il s'agit de concaténer une colonne en un champ.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Table Personne
    ID Prénom
    1  Christophe
    2  Albert
    3  Cécile
    Résultat voulu en une requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Christophe, Albert, Cécile
    Ceci afin de pouvoir placer cette sous-requête dans une requête.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Table Appartement
    NumAppart   IDPersonne     Ville
    1                      1       Lille
    2                      3       Lille
    3                      2       Paris
    Je veux obtenir une liste des appartements. Une ligne par appartement et la liste des personnes associées.

    Ceci donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Lille   Christophe, Cecile
    Paris  Albert
    Côté SQL, j'ai tenté quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    @machaine varchar(8000)
    SELECT DISTINCT Ville, 
     (select  @machaine = @machaine + Prénom + ',' from Personne p where p.id=a.IDPersonne) as personnes
    FROM Appartement a
    Mais bien sûr, ça ne fonctionne pas. Je pourrai passer par une proc. stock mais j'aimerais pouvoir le faire sur un seul ordre SQL.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    voici un exemple de comment concaténer une colonne en une seule ligne avec des , entre les valeurs.

    Je me base sur 2 tables : Auteurs et Livres sachant que un livre peut avoir plusieurs auteurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with x (num_livre, nbre, liste, auteur, longueur) as(
    select num_livre, count(*) over (partition by num_livre), cast(auteur as varchar(250)), auteur, 1
    from auteur
    union all
    select x.num_livre, x.nbre, cast(x.liste + ',' + e.auteur as varchar(250)), e.auteur, x.longueur +1
    from  auteur e, x
    where e.num_livre = x.num_livre
    and e.auteur > x.auteur)
    select num_livre, liste
    from x
    where longueur = nbre
    order by 1

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Merci pour votre réponse très instructive. Malheureusement, elle ne fonctionne que sur SQL serveur 2005 alors que ma base est sur le 2000.

    De plus, elle est assez complexe (j'avoue ne pas en avoir bien compris tous les mécanismes, surtout qu'il y a probablement une erreur car la table Livre n'est pas mentionnée).
    La difficulté est que j'ai 3 sous-requête de ce type à mettre dans une requête principale.

    Plutôt que de m'arracher les cheveux à trouver une solution en SQL, je vais probablement m'orienter vers un traitement côté code.

    Encore merci, je garde ça de côté pour un autre jour

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous ne pouvez pas faire ceci sans utiliser une requête récursive via la CTE comme décrit dans l'article que j'ai écrit : http://sqlpro.developpez.com/cours/s...te-recursives/

    Or les CTE et la récursivité n'est disponible qu'à partir de 2005. Je vous signale que la version 2008 de SQL Server sort dans quelques mois et que la version 2000 sera alors considérée comme obsolète...

    Si vous persistez en 2000 alors vous pouvez utiliser une procédure stockée récursive (lourd, complexe, mais rapide) ou bien du code client (plus léger mais moins performant).

    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/ * * * * *

Discussions similaires

  1. 'Concaténer' une colonne pour un résultat.
    Par gillou13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/08/2011, 09h13
  2. Concaténer un SELECT dans une colonne
    Par cactus2078 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 23/05/2007, 20h12
  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