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

Langage SQL Discussion :

[débutant] concaténer des champs.


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut [débutant] concaténer des champs.
    Salut à tous,
    j'aimerais faire un select sur plusieurs tables qui me renvoie pour chaque ligne de la table principale, la concatenation (avec une virgule entre chaque valeur) de chacune des ligne ayant le même identifiant dans une autre.
    Pour concrétiser simplement la question, rien ne vaut un exemple...
    une personne peut avoir 0,n numéros de téléphone
    table personne
    identifiant_personne
    nom
    prénom

    table téléphone
    identifiant_personne
    no_téléphone

    j'aimerais que la requête m'envoie par exemple
    Dupont|Jean|0145896565,0658954125,0256987502
    Bens|oncle|null
    Martin|Pierre|0625984515,0145475463

    Est-ce que c'est possible ?

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Champ1+','+Champ2 FROM TaTable

  3. #3
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Arf pardon j'avais pas tout lu, sous forme de procédure surement sinon le mieux c'est encore les GROUP BY

  4. #4
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Je pensais aussi au group by mais apparemment il n'y a pas de fonctions pour les varchar !

    Sinon j'ai la solution de faire un trigger sur la modification de la table téléphone qui renseigne un champ dans la table personne en y mettant la concatenation, mais c'est assez lourd à faire et plutôt moche !

    PS : je suis sous MS sql server 2000

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut Re: [débutant] concaténer des champs.
    Citation Envoyé par goony
    Est-ce que c'est possible ?
    Oui, ça l'est, mais c'est loin d'être simple, lis l'article de Médiat à ce sujet FAQ : Sélection multivaluée
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    C'est exactement ça mon soucis, et c'est effectivement loin d'être évident, mais quand on a pas le choix...
    Maintenant, faut comprendre !

    Et quand j'essaie chez moi, ça ne marche pas, mon client me dit
    Syntaxe incorrecte vers le mot clé 'with'.
    Ligne 2 : syntaxe incorrecte vers 'MAX'.
    Ligne 6 : syntaxe incorrecte vers 'max'.

    Est-ce que MS SQL Server 2000 ne reconnait pas cette commande ?

  7. #7
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    C'est pout Oracle 8i et supérieurs donc MS SQL Server c'est pas trop ca... lol

  8. #8
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    la deuxième solution est pour Oracle, la première est censée être pour tous les SGBD qui implementent la norme SQL 3 (ou SQL1999).
    Enfin, d'après ce que j'ai compris !

  9. #9
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par goony
    Et quand j'essaie chez moi, ça ne marche pas, mon client me dit
    Syntaxe incorrecte vers le mot clé 'with'.
    Ligne 2 : syntaxe incorrecte vers 'MAX'.
    Ligne 6 : syntaxe incorrecte vers 'max'.
    As-tu bien rajouté le mot clé RECURSIVE après le WITH ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par goony
    la deuxième solution est pour Oracle, la première est censée être pour tous les SGBD qui implementent la norme SQL 3 (ou SQL1999).
    Enfin, d'après ce que j'ai compris !
    C'est exact, mais le WITH n'est disponible qu'à partir de la version 2005 (et il ne faut pas mettre RECURSIVE (j'espère que MS aura rectifié cette erreur avant la sortie officielle )), Donc, désolé, mais cela ne marchera pas avec SQLServer 2000
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  11. #11
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    C'est exact, mais le WITH n'est disponible qu'à partir de la version 2005 (et il ne faut pas mettre RECURSIVE (j'espère que MS aura rectifié cette erreur avant la sortie officielle Wink )), Donc, désolé, mais cela ne marchera pas avec SQLServer 2000
    Et galère... c'était trop beau !

    Je vais donc devoir faire une fonction en T-SQL.

    J'ai enfin trouvé quelquechose sur le sujet sur le site,
    ASTUCE : si vous désirez concaténer toutes les valeurs d'une colonne dans une seule variable, vous pouvez utiliser la construction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DECLARE @Colonne varchar(8000) SET @Colonne = '' SELECT @Colonne = @Colonne +COALESCE(TABLE_NAME + ', ', '') FROM INFORMATION_SCHEMA.TABLES
    mais je peux pas essayer avant jeudi...
    et je comprends pas vraiment le principe.
    Quelqu'un peut m'expliquer en fançais ?

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je préfère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @Colonne varchar(8000)
    SET @Colonne = ''
     
    SELECT @Colonne = @Colonne + CASE WHEN @Colonne = ''
                                      THEN TABLE_NAME
                                      ELSE ', ' + TABLE_NAME
                                 END
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE 'AC%'
     
    print @Colonne
    Mais je ne suis pas certain que cela résolve ton problème, puisque cela ne permet que de mettre à jour une variable (@Colonne), visible grace au print.
    Le principe est de mettre à jour la variable à chaque ligne retournée par la requête.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Nickel, j'ai réussi à faire une fonction qui prend en argument un identifiant et renvoie la liste des données qu'il me faut, pour infos, je la mets ici, ça peut servir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE FUNCTION lister_telephones (@identifiant int)
    RETURNS varchar (8000)
    AS
    BEGIN
    DECLARE @liste varchar(8000)
    SET @liste = ''
    SELECT @liste = @liste + no_telephone +', '
    FROM telephone
    WHERE telephone.identifiant_personne = @identifiant
    RETURN @liste
    END
    et après un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT personne.nom, lister_colonne(personne.identifiant)
    FROM personne
    renvoie une ligne par personne et une liste de N° de téléphone (dans l'exemple), seul petit truc, c'est que la liste finit par une virgule.

  14. #14
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par goony
    seul petit truc, c'est que la liste finit par une virgule.
    Si il ne reste plus que ça, ça ne doir pas être bien dur à résoudre
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  15. #15
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par goony
    seul petit truc, c'est que la liste finit par une virgule.
    DAns la solution que j'ai proposé et qui est finalement facilement adaptable, il n'y a pas de virgule en trop
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  16. #16
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    exact, voici ce que ça donne maintenant :
    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
    CREATE FUNCTION lister_telephones (@identifiant int) 
    RETURNS varchar (8000) 
    AS 
    BEGIN 
    DECLARE @liste varchar(8000) 
    SET @liste = '' 
    SELECT @liste = @liste + CASE WHEN @liste = '' 
                                       THEN no_telephone 
                                       ELSE ', ' + no_telephone 
                                 END 
     
     
    FROM telephone 
    WHERE telephone.identifiant_personne = @identifiant 
    RETURN @liste 
    END

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CTE] Concaténer des champs de plusiers lignes
    Par chris92 dans le forum Développement
    Réponses: 7
    Dernier message: 27/07/2009, 10h17
  2. Concaténation des champs
    Par anas.eh dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/08/2008, 11h12
  3. [Débutant]Ordre des champs dans une table
    Par goony dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2006, 12h05
  4. [débutant] Ordre des champs de saisie par la touche tab
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 03/03/2005, 19h45
  5. [débutant]Desactiver des champs par rapport a un select
    Par Pymm dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/02/2005, 16h24

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