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 :

[SQL]SQL Server 2008 - concaténation de colonne


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut [SQL]SQL Server 2008 - concaténation de colonne
    Bonjour,

    j'ai un petit soucis de concaténation, j'utilise SQL Server 2008
    voici ma vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT dbo.PRG_HC.HC_ID, dbo.T_ARBO_PRG.PRG_NAME, dbo.PRG_HC.HC_ANUM, LTRIM(dbo.T_ARBO_PRG.PRG_ROOT + dbo.PRG_HC.HC_ANUM) 
                          AS [HC CODE], dbo.T_ARBO_PRG.PRG_LEVEL
    FROM dbo.PRG_HC 
    INNER JOIN dbo.T_ARBO_PRG ON dbo.PRG_HC.PRG_ID = dbo.T_ARBO_PRG.PRG_ID 
    INNER JOIN dbo.HC ON dbo.HC.HC_ID = dbo.PRG_HC.HC_ID
    HC_ID est retourné plusieurs fois et la colonne alias HC CODE possède les différentes appellations de mon HC_ID.
    Je voudrais concaténer les HC_CODE pour avoir des unique HC_ID et avoir la colonne HC CODE qui possède toutes les appellations..

    c'est pour un affichage utilisateur. car en application la concaténation prend trop de temps... il y a 532 HC et et une 10zaine d'appellations par HC

    J'espère avoir été assez clair

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Utilisez une requête récursive comme celle que j'ai donné dans mon cours 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/ * * * * *

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    J'essaye mais j'y arrive pas

    pouvez vous me dire comment ça fonctionne..
    Dans mon cas ma table n'a pas de position
    Du coup ça boucle à l'infini...

    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
    33
    34
    35
    36
     
    WITH
    phrases (phrase, id)
    AS
    (
    SELECT CAST(T_ARBO_PRG.PRG_ROOT + PRG_HC.HC_ANUM AS VARCHAR(max))
          + CASE
               WHEN SUBSTRING(T_ARBO_PRG.PRG_ROOT + PRG_HC.HC_ANUM, LEN(T_ARBO_PRG.PRG_ROOT + PRG_HC.HC_ANUM), 1) = '''' THEN ''
               ELSE ' '
            END, HC.HC_ID
    FROM   PRG_HC INNER JOIN
                          T_ARBO_PRG ON PRG_HC.PRG_ID = T_ARBO_PRG.PRG_ID INNER JOIN
                          HC ON HC.HC_ID = PRG_HC.HC_ID
    UNION ALL
    SELECT phrase + CAST(T_ARBO_PRG.PRG_ROOT + PH.HC_ANUM AS VARCHAR(max))
                 + CASE
                      WHEN SUBSTRING(T_ARBO_PRG.PRG_ROOT + PH.HC_ANUM, LEN(T_ARBO_PRG.PRG_ROOT + PH.HC_ANUM), 1) = '''' THEN ''
                      ELSE ' '
                   END AS PHRASE,
          suiv.HC_ID
    FROM   HC AS suiv
          INNER JOIN phrases
                ON suiv.HC_ID = phrases.id
          INNER JOIN PRG_HC PH ON suiv.HC_ID=PH.HC_ID 
          INNER JOIN T_ARBO_PRG ON PH.PRG_ID = T_ARBO_PRG.PRG_ID 
    ),
    maxphrase
    AS
    (
    SELECT id, MAX(id) AS maxposition
    FROM   phrases
    GROUP  BY id
    )
    SELECT id, RTRIM(phrase) + '.' AS PHRASE
    FROM   phrases
    ORDER  BY id

  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
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Si vous n'avez pas de clef dans votre table... C'est pas une table c'est un fichier Cobol.

    Commencez par le commencement en définissant la clef de votre table.

    Accessoirement respecter la charte de postage. http://www.developpez.net/forums/a69...gage-sql-lire/
    On ne peut pas deviner la structure de votre table !

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

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Oui excusez moi voici les tables qui ont des clées

    T_ARBO_PRG: PRG_ID,PRG_NAME,PRG_BD,PRG_BG,PRG_LEVEL,PRG_ROOT,PRG_LEN

    HC : HC_ID, ...

    PRG_HC : PRG_ID, HC_ID, HC_ANUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE [dbo].[T_ARBO_PRG](
    	[PRG_ID] [int] IDENTITY(1,1) NOT NULL,
    	[PRG_NAME] [varchar](32) NOT NULL,
    	[PRG_BD] [int] NOT NULL,
    	[PRG_BG] [int] NOT NULL,
    	[PRG_LEVEL] [int] NOT NULL,
    	[PRG_ROOT] [varchar](32) NULL,
    	[PRG_LEN] [int] NOT NULL,
     CONSTRAINT [PK_PRG_ID] PRIMARY KEY CLUSTERED 
    (
    	[PRG_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE [dbo].[PRG_HC](
    	[PRG_ID] [int] NOT NULL,
    	[HC_ID] [int] NOT NULL,
    	[HC_ANUM] [varchar](20) NULL,
     CONSTRAINT [PK_PRG_HC] PRIMARY KEY CLUSTERED 
    (
    	[PRG_ID] ASC,
    	[HC_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    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
    CREATE TABLE [dbo].[HC](
    	[HC_ID] [int] IDENTITY(1,1) NOT NULL,
    	[date_saisie] [datetime] NOT NULL,
    	[PRG_ID] [int] NULL,
    	[launching] [int] NULL,
    	[version] [nchar](3) NULL,
    	[engine] [nchar](10) NULL,
    	[config] [varchar](10) NULL,
    	[newRule] [nchar](7) NULL,
     CONSTRAINT [PK_HC_ID] PRIMARY KEY CLUSTERED 
    (
    	[HC_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Un petit jeu d'essais avec le résultat attendu ferais pas de mal....

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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Un petit jeu d'essais avec le résultat attendu ferais pas de mal....
    En faisant cette requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    SELECT     dbo.PRG_HC.HC_ID, LTRIM(dbo.T_ARBO_PRG.PRG_ROOT + dbo.PRG_HC.HC_ANUM) AS [HC CODE], 
                        FROM         dbo.PRG_HC INNER JOIN
                          dbo.T_ARBO_PRG ON dbo.PRG_HC.PRG_ID = dbo.T_ARBO_PRG.PRG_ID INNER JOIN
                          dbo.HC ON dbo.HC.HC_ID = dbo.PRG_HC.HC_ID
    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
     
     
    HC_ID| HC CODE| 
    2	JJ001	
    2	AAA001	
    2	T01	
    2	A 0392	
    2	1177	
    2	440229	
    3	440261	
    3	1206	
    3	A 0393	
    3	T02	
    3	JJ002	
    3	AAA002

    et je voudrais pour HC_ID :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    	JJ001	
    	AAA001	
    2	T01	
    	A 0392	
    	1177	
    	440229
    en une ligne la concaténation de ma colonne HC_CODE

    j'espère que vous m'avez compris

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    MDR! J'ai trouvé mais je comprend pas xD



    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    WITH
    phrases (phrase, id, position)
    AS
    (
    SELECT CAST(dbo.T_ARBO_PRG.PRG_ROOT + dbo.PRG_HC.HC_ANUM AS VARCHAR(max))
          + CASE
               WHEN SUBSTRING(dbo.T_ARBO_PRG.PRG_ROOT + dbo.PRG_HC.HC_ANUM, LEN(dbo.T_ARBO_PRG.PRG_ROOT + dbo.PRG_HC.HC_ANUM), 1) = '''' THEN ''
               ELSE ' '
            END, PRG_HC.HC_ID, PRG_LEVEL
    FROM   dbo.PRG_HC 
    INNER JOIN dbo.T_ARBO_PRG ON dbo.PRG_HC.PRG_ID = dbo.T_ARBO_PRG.PRG_ID 
    INNER JOIN dbo.HC ON dbo.HC.HC_ID = dbo.PRG_HC.HC_ID
    WHERE  PRG_LEVEL = 0
    UNION ALL
    SELECT phrase + CAST(dbo.T_ARBO_PRG.PRG_ROOT + suiv.HC_ANUM AS VARCHAR(max))
                 + CASE
                      WHEN SUBSTRING(dbo.T_ARBO_PRG.PRG_ROOT + suiv.HC_ANUM, LEN(dbo.T_ARBO_PRG.PRG_ROOT + suiv.HC_ANUM), 1) = '''' THEN ''
                      ELSE ' '
                   END AS PHRASE,
          suiv.HC_ID, PRG_LEVEL
    FROM   dbo.PRG_HC AS suiv
    INNER JOIN dbo.T_ARBO_PRG ON suiv.PRG_ID = dbo.T_ARBO_PRG.PRG_ID 
    INNER JOIN dbo.HC ON dbo.HC.HC_ID = suiv.HC_ID 
    INNER JOIN phrases
                ON suiv.HC_ID = phrases.id
                   AND T_ARBO_PRG.PRG_LEVEL = phrases.position + 1
    ),
    maxphrase
    AS
    (
    SELECT id, MAX(position) AS maxposition
    FROM   phrases
    GROUP  BY id
    )
    SELECT P.id, RTRIM(phrase) + '.' AS PHRASE
    FROM   phrases AS P
          INNER JOIN maxphrase AS M
                ON P.id = M.id
                   AND P.position = M.maxposition
    ORDER  BY id
    pouvez vous m'expliquez ce que font les select svp ?

    d'autre part j'ai mes codes qui sont concatener mais ils sont collés... comment puis je faire un retour à la ligne pour chaque code ?


    Sinon c'est super puissant !!!

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par lerieure Voir le message
    d'autre part j'ai mes codes qui sont concatener mais ils sont collés... comment puis je faire un retour à la ligne pour chaque code ?
    Ajoutez n'importe queoi entre les deux colonnes concaténées. pour un retour chariot :
    CHAR(13) + CHAR(10)

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

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

Discussions similaires

  1. SQL Server 2008 : les nouveautés . . .
    Par SQLpro dans le forum MS SQL Server
    Réponses: 51
    Dernier message: 12/05/2010, 16h10
  2. [MS SQL Server] connaitre grandeur des colonnes
    Par Husqvarna dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/11/2006, 09h49
  3. [SQL Server 2005] Recherche sur colonne "Image"
    Par frechy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/09/2006, 18h35
  4. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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