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 :

Fusion des lignes en un seul


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 34
    Points
    34
    Par défaut Fusion des lignes en un seul
    Bonjour,
    j'ai un question à propos la possibilité d'insérer plusieurs lignes en un seul (fusion)
    Exemple
    si j'ai un tableau tab 1 qui contient :
    Colonne :
    DOCTYPE:
    'DOC1'
    'DOC2'
    'DOC3'
    'DOC4'
    'DOC5'
    je veux que je fusionne ses lignes en un seul ligne dans un autre tableau DOCTYPE2
    et le resultat est la suivante
    Colonne:
    DOCTYPE
    'DOC1\DOC2\DOC3\DOC4\DOC5'
    je travail sur SQL SERVER 2005

    Merci d'avance pour toute proposition

  2. #2
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 55
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Code sql : 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
    DECLARE @Chaine varchar(max)
    SET @Chaine=''
    DECLARE @nouvChaine varchar(max)
    SET @nouvChaine=''
    DECLARE @docType Varchar(40)
    DECLARE #Doctype CURSOR
    FOR SELECT DOCTYPE FROM tab1
    OPEN #Doctype
    FETCH #Doctype INTO @docType
    WHILE(@@fetch_status=0)
     BEGIN
     
        SET @Chaine=@Chaine+@docType+'\'
     
     FETCH #Doctype INTO @docType
     END
    SET @nouvChaine=substring(@Chaine,0,len(@Chaine))
    --ici tu fais ta requete d'insertion en utilisant la variable @nouvChaine contient les valeurs de la colonne
    --DOCTYPE de table tab1 sous forme de val1\val2\...
    CLOSE #Doctype
    DEALLOCATE #Doctype

    a+

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    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 810
    Points : 52 865
    Points
    52 865
    Billets dans le blog
    5
    Par défaut
    Oulala le vilain curseur !!!! Inutile d'utiliser une telle chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @RESULT VARCHAR(max);
    SET @RESULT = '';
    SELECT @RESULT = @RESULT + '\ ' + DOCTYPE
    FROM   MaTable
    ORDER BY DOCTYPE;
    SELECT SUBSTRING(@RESULT, 1, LEN(@RESULT) - 1) AS RESULTAT;
    Cela dit c'est le genre d'idiotie à éviter absolument. Un SGBDR n'est pas fait pour faire de la présentation !!!
    A Lire : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Merci c'est effectivement ça que je cherche mais il ya un petit soucis
    le voila : On fait j'ai deux colonnes
    id | Colonne1
    1 | DOC1
    1 | DOC2
    1 | DOC3
    1 | DOC4
    1 | DOC5
    1 | DOC6

    et ce que je veux c'est faire un groupe by et le résultat c'est comme ça
    id |Colonne1
    1 |'DOC1\DOC2\DOC3\DOC4\DOC5\DOC6'

    Merci d'avance

  5. #5
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 55
    Points : 46
    Points
    46
    Par défaut
    bonjour,

    merci SQLPro pour ton Eclaircissement, mais j'ai une petite remarque sur ton code concernant la requete select, je pense qu'elle devra etre comme cela:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @RESULT = @RESULT +DOCTYPE +'\'



    a++

  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 810
    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 810
    Points : 52 865
    Points
    52 865
    Billets dans le blog
    5
    Par défaut
    Excusez moi à l'avance d'être un peu violent, mais faire bosser des gens à votre place, sans donner dès le départ ce que vous voulez faire exactement, c'est faire perdre du temps aux gens et c'est aussi les prendre pour des cons.

    Je vais sans doute me faire encore pourrir par mes confrères modérateurs, (alors que personnellement je ne modère jamais), mais à l'avenir postez des le départ toutes les conditions de votre problème.

    De surcroit vous n'avez pas respecté la charte de postage de ce forum qui vous demande de poster le DDL de vos tables (CREATE TABLE...) ainsi qu'un jue d'essais sous forme INSERT....
    http://www.developpez.net/forums/d96...vement-poster/

    Donc, commencez par respecter les règles, nous pourrons alors vous aider !

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    J'ai trouvé une solution pour faire la concaténation de plusieurs lignes en un seul et voila la solution:
    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
     
    DECLARE @Chaine varchar(max)
    DECLARE @ID int
    DECLARE @ID1 int
    SET @Chaine=''
    DECLARE @nouvChaine varchar(max)
    SET @nouvChaine=''
    DECLARE @docType Varchar(40)
    DECLARE @docType1 Varchar(40)
    DECLARE #Doctype CURSOR
    FOR SELECT DISTINCT
    T1.ID AS ID,
    T1.DOCUMENTTYPE 
    FROM  T1;
    OPEN #Doctype
    FETCH #Doctype INTO @ID,@docType
    FETCH #Doctype INTO @ID1,@docType1
    WHILE(@@fetch_status=0)
     BEGIN
     
       WHILE (@ID1=@ID)
         BEGIN
            SET @Chaine=@Chaine+@docType+'\''+@docType1
            FETCH #Doctype INTO @ID1,@docType1
         END 
        INSERT  DOCTYPETABLE VALUES(@ID,substring(@Chaine,0,len(@Chaine)))
     SET @ID=@ID1
     SET @Chaine=@docType1
     SET @docType=''
     FETCH #Doctype INTO @ID1,@docType1
      if(@@fetch_status<>0)
        BEGIN
         --ici je fait l''insertion de resultatde concaténation dans un nouveau tableau
         INSERT  DOCTYPETABLE VALUES(@ID,substring(@Chaine,0,len(@Chaine)))
        END
     END
    CLOSE #Doctype
    DEALLOCATE #Doctype
    Donc c'est bon merci brinx pour ton meilleur idée
    et je vous souhaite une bonne concaténation

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Oula un curseur pour faire cela c'est dommage quand même

    ++

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 34
    Points
    34
    Par défaut
    t'as une idée SIMPLE autre qu'un curseur !

  10. #10
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bien sûr. On ne le dira jamais assez les curseurs peuvent être évités dans la plupart des cas. Les bases de données sont plus performants quand ils traitent des ensembles ...

    Au niveau des solutions il y en a pas mal et je vous en citerai au moins 2 :

    - Les CTE récursives (si vous êtes sur une version 2005 ou ultérieure).
    SQLPro a fait un article très intéressant sur le sujet. Je vous laisse le découvrir.

    - Avec XML PATH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
     id,
     STUFF((SELECT '\' + texte  
                FROM tab p2
                WHERE p1.id = p2.id
                ORDER BY id
                FOR XML PATH('')), 1, 1, '') AS texte_concat
    FROM tab p1
    GROUP BY id ;
    etc ...

    ++

  11. #11
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    J'ai montré ici que les curseurs sont contre-performants.
    C'est de plus une évidence puisque SQL est par nature un langage ensembliste.
    En conséquence, ses implémentations sont conçues pour traiter des données dans leur ensemble et non pas dans leurs occurrences.

    J'ai donné ici une méthode de concaténation des valeurs d'une colonne à l'aide d'une CTE récursive

    @++

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/06/2015, 10h21
  2. Réponses: 4
    Dernier message: 10/12/2013, 10h17
  3. [AC-2010] Fusion des lignes d'un champ
    Par authou dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/01/2013, 17h39
  4. grouper des lignes en un seul avec des conditions
    Par afrozeen dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 22/05/2009, 11h07
  5. SQL : Regrouper des lignes dans une seule colonne
    Par manoir62 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h06

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