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 :

Concaténer texte avant le retrait des doublons


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Concaténer texte avant le retrait des doublons
    Bonjour à tous !

    J'ai vraiment besoin d'aide. Je travail avec SAS pour le traitement de données pour l'entreprise pour laquelle je travail. Le merveilleux monde de la programmation est relativement nouveau pour moi et j'espère ne pas poser ici une question stupide....

    J'aimerais savoir comment je peu programmer en language SQL afin de concaténer des bouts de texte présents dans les lignes des doublons avant de les effacer de ma base de données avec SELECT DISTINCT.

    En fait j'aimerais que le système comprenne que je veux simplement qu'il concaténe lorsque par exemple la donnée de la colonne 1 = la donnée de la colonne 1....

    J'ai essayer de le faire comme suit;

    proc sql;
    create table table1 as
    select distinct(a1), a2, a3, a4
    if a1=a1 then a2!!a2;
    if a1=a1 then a4!!a4;
    quit;

    Mais ca ne fonctionne pas.

    Est ce que quelqu'un pourrait m'aide ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,
    Peux tu détailler la structure de ta table s'il te plait?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse rapide !

    Par exemple.

    Disons que mes données ressembles à ceci ( "/" représente la divison des colonnes);

    numéro client / type / destination

    55555 / bleu / canada
    45454 /vert / france
    55555 / rouge / ecosse
    88545 / orange / finlande

    Donc je voudrais concaténer le type et la destination pour les doublons et les effacer ensuite et donc obtenir;

    55555 / bleu,rouge / canada,ecosse
    45454 /vert / france
    88545 /orange / finlande

    Merci !!

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Tu peux jeter un oeil à ce thread, le post de SQLpro devrait t'aider.
    http://www.developpez.net/forums/sho....php?p=2962922

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'y travail depuis 3 heures sans succès. Je ne comprend pas tout à fait
    le programme en question.

    Bon je vais continuer à travailler là dessus et tenter de trouver une solution.

    Si vous avez d'autres suggestions...

    Merci

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    As-tu bien lu l'article sur les CTE d'SQLpro ?

    Peut-être avec un Iif sinon !


  7. #7
    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
    Je précise que les CTE de SQL Pro n'existent que sur SQL Serveur 2005 et pas sur SQL Serveur 2000, sur SQL Serveur 2000, il y a moyen d'écrire une Fonction TRANSACT SQL pour obtenir le résultat mais c'est moins propre que les CTE.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    A ton prochain passage, tu pourrais nous en dire plus sur ton environnement s'il te plait?
    Je ne connais pas bien SAS, je doute que ton environnement supporte les CTE.
    Peux tu faire une procédure pl-sql pour résoudre ton problème?

    Concernant les CTE, la première étape est d'assigner un ordre à chacun des champs à concaténer, avec une sous-requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select numclient, typeclient, destination, dense_rank() over (partition by numclient order by typeclient) as position from matable
    Attention, ça suppose que tu n'as pas de doublon au niveau du type de client (pour un même numéro client), sinon cette requète est à re-penser.

    Je pourrais difficilement t'en dire davantage, j'ai pas d'environnement qui supporte les CTE sous la main...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bon, déjà désolé pour le double post. Ya manifestement pas beaucoup de solutions proposées (et j'avais pas trop de temps vendredi... ), je vais donc proposer la suivante, même si elle est loin d'être géniale, au cas où tu serais toujours la dessus.

    Dans le cas où t'as plus de deux doublons par numclient, faudra la rejouer plusieurs fois (bah ouè, pas de récursif, on fait ce qu'on peut ).

    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
    24
    25
    select numclient, typeclient, destination from
    (
    select 
    	   numclient,
    	   case when numclient = lag(numclient) over (order by numclient) then typeclient || ', ' || lag(typeclient) over (order by numclient)
    	   		else typeclient
    	   end as typeclient,
    	   case when numclient = lag(numclient) over (order by numclient) then destination || ', ' || lag(destination) over (order by numclient)
    	   		else destination
    	   end as destination,
    	   position,
    	   maxposition
    from
    (
          select 
                numclient, 
                typeclient, 
                destination, 
                dense_rank() over (partition by numclient order by typeclient) as position, 
                count(typeclient) over (partition by numclient) as maxposition 
          from matable 
          order by numclient, typeclient, destination
    )
    )
    where position = maxposition
    En gros, la sous requête assigne un rang à chaque occurence de numclient (position), et calcule le rang max (maxposition).
    La requête principale, concatène les champs typeclient et destination si l'enregistrement précédent a le même numclient, et on ne conservera que le champs dont la position est égale à la position max.

    Bon, pour l'instant j'ai pas mieux, j'avoue que j'y ai pas consacré beaucoup de temps non plus...
    Précise un peu ton souci (combien de doublons au maximum, environnement, tous les détails sont les bienvenus pour comprendre un problème), j'y passerai peut être un peu plus de temps si ça vaut le coup, mais mon modeste niveau ne garanti pas de résultat :/

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour les infos.

    Je vais travailler là dessus aujourd'hui et vous en donnerai des nouvelles !

    Si je n'arrive toujours pas... je vous dennerai plus de détails.

    Merci encore !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour !
    J'ai réussi à régler mon problème avec un PROC TRANSPOSE suivi d'un data set pour concaténer.

    Merci et bonne journée !!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/09/2014, 16h20
  2. Concaténer des doublons
    Par gurnetn dans le forum SAS Base
    Réponses: 5
    Dernier message: 21/01/2013, 16h07
  3. [RegEx] épurer un texte des doublons
    Par SpaceFrog dans le forum Langage
    Réponses: 21
    Dernier message: 12/10/2009, 14h17
  4. Réponses: 0
    Dernier message: 14/07/2009, 18h48
  5. formulaire et concaténation type="text" avant soumission
    Par jakouz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/04/2006, 10h39

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