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 :

Petite question de "concaténation"


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut Petite question de "concaténation"
    Bonjour,

    Je ne sais pas si le terme de concaténation est le bon, mais il ne m'en est pas venu d'autre à l'esprit
    Voilà, j'ai un petit problème tout bête qui se résume ainsi:

    J'ai une table contenant diverses informations sur des clients (contact).
    Celle-ci se représente ainsi:

    SH_reference SH_NAME SH_RFO Surname First_Name
    486595841 xxxx VE aaa ddd
    486595841 xxxx VE bbb eee
    486595841 xxxx VE ccc fff

    Un même client peut avoir un ou plusieurs contacts ayant des rangs différents dans la société ( Direction, associé, etc ).

    Je dois créer une vue donnant le résultat en indiquant le nom et le prénom de chaque contact sur une seule ligne (Nom1, Prénom1, Nom2,Prénom2, ..., Nom5, Prénom5) une limite étant fixée à 5 Contacts possibles (voir fichier XLS joint)

    J'ai tenté avec du COALESCE mais je pense que ce n'est pas la bonne approche.
    Sachant que je ne peux pas créer de fonction, je vais devoir certainement travailler avec des tables temporaires.

    Auriez-vous une idée de la meilleure approche? Je vous remercie par avance de votre aide précieuse
    Fichiers attachés Fichiers attachés
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    On peut faire cela avec une table mémoire, mais un SGBDR n'est pas fait pour la cosmétique. L'affichage devrait être réalisé côté client.

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    Justement le problème est là, c'est que le frontend est Access qui jusque maintenant utilisait des tables liées d'un AS400.
    Celui-ci devant être "supprimé", il m'est maintenant demandé de créer les Vues sur lesquelles le Frontend pourrait être lié.

    Je suis moi même convaincu que ce n'est pas la meilleure approche, mais n'ayant pas le temps de refaire le design du Frontend, il ne me reste que malheureusement l'approche des Views

    Aurais-tu éventuellement un exemple de comment je pourrais gérer cela avec du T-SQL?

    Encore merci
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    Je présume que tu disposes d'une table client et contact. Un client pouvant disposer de n contacts.

    La première chose à réaliser est une fonction table. Cette fonction recevra un paramètre qui est l'ID du client. Le paramètre de retour sera un varchar contenant la liste des noms des 5 premiers contacts.

    La vue sera du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT co.IDClient, ct.Contact
    FROM Client co
       CROSS APPLY MaFonctionTable(co.IDClient) ct

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : août 2009
    Messages : 623
    Points : 1 048
    Points
    1 048
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT nom + ','
    FROM Client 
    FOR XML PATH('')
    mais c'est vraiment pas terrible...
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    août 2005
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 431
    Points : 12 786
    Points
    12 786
    Par défaut
    Tu as le choix des méthodes de concaténation :

    CTE récursive, XML ou autre.

    Tu peux nous donner un peu plus de précision sur tes tables concernées (schéma + indexes) et une idée de la volumétrie.

    ++

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    tout d'abord, je tiens à m'excuser pour la réponse tardive, mais divers projets en cours qui, bien entendu doivent être livrés pour dan 6 mois en arriére (Ah les chefs de projets qui sont toujours pressés )

    En terme de volumétrie, je tape sur 3 tables différentes situées sur 2 serveurs différents (Linked Server).
    Les données représentes environ 6 Millions de lignes au total.
    Du point de vue des index, l'une des bases n'est pas optimisée (ils viennent de la créer et le temps qu'ils implémentent les index que j'ai demandé, je devrais attendre jusque Vendredi prochain et je n'ai pas le temps d'attendre )

    En ce qui concerne les tables concernées, je joint (fichiers txt) les scripts de creation des tables.

    Pour ce qui est des données que je dois récupérer, cela ressemble à:

    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
    26
    27
    28
    29
    30
    31
    32
    SELECT   
    		  Se.Duns_Number AS SH_DUNS
    		, Se.NME_TEXT_Company AS SH_NAME
    		, Shd.SHDADC AS SH_CO
    		, Se.Mail_Address AS SH_STR
    		, Se.POST_CODE_Mail_Address AS SH_PLZ
    		, Se.POST_TOWN_Mail_Address AS SH_ORT
    		, Se.TERR_Mail_Address AS SH_KTO
    		, Se.Std_INDS_CODE_Sic_1 AS SH_SIC1
    		, Se.STD_INDS_CODE_Sic_2 AS SH_SIC2
    		, Se.STD_INDS_CODE_sic_3 AS SH_SIC3
    		, Se.[LGL_FORM_CD_Legal_Form] AS SH_RFO
    		, '' AS SH_GRDT
    		, '' AS SH_KAPBET
    		, '' AS SH_KAPLIB
    		, S06.S06NAN AS S06NAN
    		, S06.S06VON AS S06VON
    		, S06.S06WOO AS S06WOO
    		, S06.S06FK1 AS S06FK1
    		, S06.S06US1 AS S06US1 
    		, Se.[ACTV_TEXT_Trade_Register] AS SH_ZWECK
    		, Se.Std_INDS_CODE_Sic_4 AS SH_SIC4
    		, Se.STD_INDS_CODE_Sic_5 AS SH_SIC5
    		, Se.STD_INDS_CODE_sic_6 AS SH_SIC6
    		, Shd.SHDLFN AS SH_SHDLFN
    		, Shd.SHDSTA AS SH_Status
     
     
     FROM  dbo.SwissExtract Se 
    INNER JOIN  [SHABTOACCESS].[Shab_Import].dbo.SHABHD Shd ON Shd.PXCHNR=Se.REGN_NBR_Register collate SQL_Latin1_General_CP1_CI_AS
    LEFT outer JOIN [SHABTOACCESS].[Shab_Import].dbo.SHAB06 S06 ON S06.S06LFN = Shd.SHDLFN --collate SQL_Latin1_General_CP1_CI_AS
    LEFT OUTER JOIN dbo.SwissExtract_ExecutivesLarge SeEl ON Se.Duns_Number = SeEl.Duns_Number collate SQL_Latin1_General_CP1_CI_AS
    Sachant que S06Nan est le nom de famille, S06Von est le prénom, S06Woo est l'adresse et S06FK1 est la fonction de chaque contact de l'entreprise.

    Le but étant, comme je l'ai déjà mentionné, que pour chaque entreprise j'ai tous les noms et prénoms de chaque contact sur une seule ligne.

    Je suis tenté par l'idée de la CTE, mais je dois avouer que je suis un poil à la ramasse sur ce coup là et vu le peu de temps que j'ai pour livrer tout ça, j'apprécierais vraiment un coup de main

    Encore merci d'avance pour votre aide précieuse.
    Fichiers attachés Fichiers attachés
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Tu as le choix des méthodes de concaténation :

    CTE récursive, XML ou autre.

    Tu peux nous donner un peu plus de précision sur tes tables concernées (schéma + indexes) et une idée de la volumétrie.

    ++
    Et les fonctions d'agreggation CLR extrêmement efficace, mais attention si vous voulez concaténer dans un ordre(ORDER BY) bien précis, non encore supporté ...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  9. #9
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    justement, dans la mesure où il doit y avoir le classement des contacts et ensuite des clients par date d'activité, la CLR n'est pas possible ( Je pense que j'avais omis ce détail, désolé ).

    Si vous avez des pistes pour la CTE, je suis toujours preneur
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 20 987
    Points : 49 812
    Points
    49 812
    Billets dans le blog
    1
    Par défaut
    Inspirez vous de l'exemple que j'ai donné ici :
    http://sqlpro.developpez.com/cours/s...ursives/#LIV-D

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

  11. #11
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    Je me suis basé sur l'article que vous avez mentionné.
    J'ai pu effectivement obtenir la concaténation demandée par l'utilisateur.
    Il me reste maintenant à optimiser la requête afin que les performances soient meilleures.
    En effet, je dois maintenant lier les informations obtenues par la CTE à des données situées sur un autre serveur.

    Mais je vous remercie pour vos pistes précieuses et je vous souhaite une bonne fin de journée à tous.
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

  12. #12
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : mars 2012
    Messages : 81
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    J'avais oublié de donner le code de ma CTE ( Ca pourra peut-être servir à d'autres personnes )
    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
     
    ;with cte as 
    (select S06LFN,
            S06LFX,
            S06NAN,
            S06VON,
            S06Woo, 
            S06FK1, 
            S06US1, 
            S06KAP,
            row_number() over (PARTITION BY S06LFN ORDER BY s06fk1 desc ) AS 'RowNum'
        FROM DATABASE_NAME)
    SELECT distinct 
    				   t1.S06LFN
    				  , t1.S06NAN SH_PRS1NAM ,t1.S06VON SH_PRS1VNA, t1.S06Woo SH_PRS1WOO, t1.S06FK1 SH_PRSFKT1, t1.S06US1 SH_PRS1USC, t1.S06KAP SH_PRS1KAP
    				 , t2.S06NAN SH_PRS2NAM ,t2.S06VON SH_PRS2VNA, t2.S06Woo SH_PRS2WOO, t2.S06FK1 SH_PRSFKT2, t2.S06US1 SH_PRS2USC, t2.S06KAP SH_PRS2KAP
    				 , t3.S06NAN SH_PRS3NAM ,t3.S06VON SH_PRS3VNA, t1.S06Woo SH_PRS1WOO, t3.S06FK1 SH_PRSFKT3, t3.S06US1 SH_PRS3USC, t3.S06KAP SH_PRS3KAP
    				 , t4.S06NAN SH_PRS4NAM ,t4.S06VON SH_PRS4VNA, t1.S06Woo SH_PRS1WOO, t4.S06FK1 SH_PRSFKT4, t4.S06US1 SH_PRS4USC, t4.S06KAP SH_PRS4KAP
    				 , t5.S06NAN SH_PRS5NAM ,t5.S06VON SH_PRS5VNA, t1.S06Woo SH_PRS1WOO, t5.S06FK1 SH_PRSFKT5, t5.S06US1 SH_PRS5USC, t5.S06KAP SH_PRS5KAP
    from cte t1
    left join cte t2 on t1.S06LFN = t2.S06LFN and t2.RowNum = 2
    left join cte t3 on t1.S06LFN = t3.S06LFN and t3.RowNum = 3
    left join cte t4 on t1.S06LFN = t4.S06LFN and t4.RowNum = 4
    left join cte t5 on t1.S06LFN = t5.S06LFN and t3.RowNum = 5
    where t1.RowNum = 1
    Ce n'est certes pas forcément ce qu'il y a de plus joli, mais cela fonctionne et mon RP est content
    Maintenant je peux marquer résolu
    Bien souvent on peut résumer les problèmes rencontrés par:

    select Cause from Error

    Results:
    Interface_Chaise_Clavier

    Bonne journée

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

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