Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1423 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Q] Concaténer les résultats sur un champs...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Q] Concaténer les résultats sur un champs...

n°2169234
Schnouf
A table !
Posté le 27-12-2012 à 18:28:58  profilanswer
 

Hello, disons j'ai 2 tables de ce type:
 
user
id_user
name_user
 
phone
id_phone
number_phone
#id_user

 
Il peut donc y avoir 0, 1 ou plusieurs numéro de tél (number_phone) par utilisateur.
je peux tout afficher en faisant :

Code :
  1. select user.name_user, phone.number_phone
  2. from user
  3. left outer join phone
  4.    on phone.id_user = user.id_user


 
Ca m'affiche un truc du style :
user1 phone1
user1 phone2
user1 phone3
user2 phone1
user3
user4 phone1
user4 phone2

 
J'aimerais obtenir plutot un résultat du type :
user1 phone1,phone2,phone3
user2 phone1
user3
user4 phone1,phone2

 
C'est possible, sans surcharger le serveur (SQL Server) ?
 [:ojap]

mood
Publicité
Posté le 27-12-2012 à 18:28:58  profilanswer
 

n°2169252
Oliiii
Posté le 28-12-2012 à 09:05:20  profilanswer
 

Pour faire court, oui c'est possible mais c'est encore 100x mieux si tu le fais au niveau de ton application ou de ton interface.
 
SGBD = Doué pour comparer/traiter des colonnes
Application = Doué pour comparer/traiter des lignes

n°2169255
Schnouf
A table !
Posté le 28-12-2012 à 09:48:56  profilanswer
 

J'ai pas d'application ou interface :'(
Les requêtes sont envoyées en direct depuis une interface web, je n'ai pas la main sur les sources de la dite interface...

n°2169278
Oliiii
Posté le 28-12-2012 à 17:30:19  profilanswer
 

Une fois que tu as recu la reponse de SQL tu en fais quoi?
 
Si tu dois l'afficher quelque part en utilisant du php ou de l'asp tu peux utiliser ca pour formater tout correctement.

n°2169293
Schnouf
A table !
Posté le 28-12-2012 à 18:40:21  profilanswer
 

Le résultat apparait dans la même interface web, puis il est exportable en csv ou xml.
Mais le résultat doit directement être exploitable depuis la page web, donc tout doit se passer dans la requête.

 

Si j'avais eu accès à une interface entre la requête et son exploitation bien sûr que je l'aurais utilisée pour soulager le serveur mais aussi pour éviter de me prendre la tête :o

n°2169423
Oliiii
Posté le 31-12-2012 à 08:40:49  profilanswer
 

Voila deux facon differente de le faire:

Code :
  1. SELECT a.name_user, SUBSTRING((
  2.     SELECT ', ' + b.number_phone
  3.     FROM @phone b
  4.     WHERE b.id_user = a.id_user
  5.     FOR XML PATH(''), TYPE
  6.     ).value('.','varchar(max)'), 2, 9999) number_phone
  7. FROM @user a
  8.  
  9. ;With ctePhone (id_user, number_phone, rn, rnR) AS
  10.     (
  11.         SELECT a.name_user
  12.              , b.number_phone
  13.              , ROW_NUMBER() OVER (PARTITION BY a.name_user ORDER BY a.name_user, b.number_phone) rn
  14.              , ROW_NUMBER() OVER (PARTITION BY a.name_user ORDER BY a.name_user DESC, b.number_phone DESC) rnR
  15.         FROM @user a
  16.             LEFT JOIN @phone b ON b.id_user = a.id_user
  17.     ),
  18.     cteRec (id_user, number_phone, rn, rnR) AS
  19.     (
  20.         SELECT id_user, CONVERT(varchar(max),number_phone) number_phone, rn, rnR
  21.         FROM ctePhone
  22.         WHERE rn = 1
  23.         UNION ALL
  24.         SELECT a.id_user, CONVERT(varchar(max),b.number_phone + ', ' + a.number_phone) number_phone, a.rn, a.rnR
  25.         FROM ctePhone a
  26.             JOIN cteRec b ON b.id_user = a.id_user AND a.rn = b.rn + 1
  27.     )
  28. SELECT id_user, number_phone
  29. FROM cteRec
  30. WHERE rnR = 1
  31. ORDER BY id_user


 
Ce n'est pas performant et ca ne scale pas du tout, donc ce n'est bon que pour un petit nombre de user.
Un SGBD ce n'est pas fait pour sortir des data qui doivent etre affichée directement, si il y a du formatage a faire ou de la mise en page ca doit etre fait par la couche applicative.


Message édité par Oliiii le 31-12-2012 à 08:44:24
n°2169866
Schnouf
A table !
Posté le 04-01-2013 à 14:55:11  profilanswer
 

Hello,
 
Merci ! J'ai pour l'instant testé uniquement la première solution.
Je suis satisfait du temps d'exécution et du résultat.
 
Je vais tenter de comparer le temps d'exécution avec la deuxième solution qui me paraît moins facile à intégrer à ma requête [:arkns:4]

n°2170326
CyberDenix
Posté le 09-01-2013 à 00:34:56  profilanswer
 

Heu... GROUP_CONCAT ?
 
C'est un peu fait pour ça les gars ;)


---------------
Directeur Technique (CTO)
n°2170346
Oliiii
Posté le 09-01-2013 à 08:19:16  profilanswer
 

Ca n'existe pas en SQL Server.

n°2170659
CyberDenix
Posté le 10-01-2013 à 22:37:19  profilanswer
 

Oups.
 
Ça démontre bien que SQL Server c'est de la merde.


---------------
Directeur Technique (CTO)
mood
Publicité
Posté le 10-01-2013 à 22:37:19  profilanswer
 

n°2170698
Oliiii
Posté le 11-01-2013 à 11:42:12  profilanswer
 

Chaque SGBD a des avantages et inconvenient, aucun des gros SGBD n'est pourris, ils excellent tous dans leur domaine.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Q] Concaténer les résultats sur un champs...

 

Sujets relatifs
Obtention résultats sportifs[MySQL] champs date et suite de row consecutive...
[résolu] taper texte dans champs text et affichage dynamiqueProbleme de resultats avec AS 1 & 2
[SQL] Fusionner 2 champs de 2 tables différentes [résolu]Insertion de caractère dans un nom de mes champs XML
Resultats incoherent lors d'une reque sql[Access] Concaténer dans un champ
[Résolu] Intégrer le code du captcha au reste du code de traitementBug champs options avec Paiement CIC
Plus de sujets relatifs à : [Q] Concaténer les résultats sur un champs...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR