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 :

concatener plusieurs entrées en une


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut concatener plusieurs entrées en une
    Bonjour a vous,

    Je suis un peu perdu

    J'ai une table avec

    TABLE ACHAT
    ID_CLIENT | ACHAT_CLIENT
    001 | fleur
    002 | creme
    002 | viande
    002 | pain
    003 | chocolat


    et je voudrais creer une table qui fait :

    ID_CLIENT | TOUS_LES_ACHATS
    001 | fleur
    002 | creme viande pain
    003 | chocolat

    Dit autrement, concatainer les achat_client dans une nouvelle variable pour chaque client.
    Evident le tout fait dans une requete sql. J'ai essayé avec des curseurs mais je ne m'en sort pas et ca prend plein de temps.

    Avez vous une idée?

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Il s'agit là de mise en forme des données, qui n'est pas le but du langage SQL.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par al1_24
    Il s'agit là de mise en forme des données, qui n'est pas le but du langage SQL.

    Je suis tout a fait d'accord. Mais le probleme c'est qu'il y a une architecture derriere que je ne peux changer. Je suis donc obligé de faire cela en SQL.
    De plus, ici je ne sais pas combien j'aurai de ligne a concatener. Je ne peux donc pas faire d'union. J'ai essayé avec des while mais je ne m'en sors pas.

  4. #4
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2002
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2002
    Messages : 98
    Points : 169
    Points
    169
    Par défaut
    Uniquement pour Oracle 9i et +

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    -- toList.sql
    --
    -- Cree une fonction d'aggregats qui regroupe sur une ligne
    -- des varchars separes par une ,
    --
    -- Exemple d'utilisation:
    -- select table_name,toList(column_name) from all_ind_columns group by table_name;
    --
    -- Fonctionne uniquement a partir de Oracle 9i
     
     
    CREATE OR REPLACE TYPE tolistimp1 AS OBJECT (
       LIST   VARCHAR2 (32767),
       STATIC FUNCTION odciaggregateinitialize (listctx IN OUT tolistimp1)
          RETURN NUMBER,
       MEMBER FUNCTION odciaggregateiterate (
          SELF    IN OUT   tolistimp1,
          VALUE   IN       VARCHAR2
       )
          RETURN NUMBER,
       MEMBER FUNCTION odciaggregatemerge (
          SELF   IN OUT   tolisttype,
          ctx2   IN       tolisttype
       )
          RETURN NUMBER,
       MEMBER FUNCTION odciaggregateterminate (
          SELF          IN       tolistimp1,
          returnvalue   OUT      VARCHAR2,
          flags         IN       STRING
       )
          RETURN NUMBER
    );
    CREATE OR REPLACE TYPE BODY tolistimp1
    IS
       STATIC FUNCTION odciaggregateinitialize (listctx IN OUT tolistimp1)
          RETURN NUMBER
       IS
       BEGIN /* initialize our persistent variable, list */
          listctx := tolistimp1 (NULL);
          RETURN odciconst.success;
       END;
       MEMBER FUNCTION odciaggregateiterate (
          SELF    IN OUT   tolistimp1,
          VALUE   IN       VARCHAR2
       )
          RETURN NUMBER
       IS
       BEGIN
          IF (SELF.LIST IS NULL)
          THEN
             SELF.LIST := VALUE;
          ELSE
             SELF.LIST := SELF.LIST || ',' || VALUE;
          END IF;
     
          RETURN odciconst.success;
       END;
       MEMBER FUNCTION odciaggregatemerge (
          SELF   IN OUT   tolisttype,
          ctx2   IN       tolisttype
       )
          RETURN NUMBER
       IS
       BEGIN
          RETURN odciconst.success;
       END;
       MEMBER FUNCTION odciaggregateterminate (
          SELF          IN       tolistimp1,
          returnvalue   OUT      VARCHAR2,
          flags         IN       STRING
       )
          RETURN NUMBER
       IS
       BEGIN
          returnvalue := SELF.LIST;
          RETURN odciconst.success;
       END;
    END;
    /
     
    CREATE OR REPLACE FUNCTION tolist (input STRING)
       RETURN STRING
       AGGREGATE USING tolistimp1;

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis sur microsoft sql server.
    On a trouvé une solution en creant une table virtuel et deux cursors. Si j'ai le temps je deposerai la solution ajd ou demain.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    TABLE ACHAT : ID_ACHAT | ID_CLIENT | ACHAT_CLIENT
    001 | 001 | fleur
    002 | 002 | creme
    003 | 002 | viande
    004 | 002 | pain
    005 | 003 | chocolat


    DECLARE @int as int,@text as nvarchar(100)
    DECLARE @tab table(id_client int, lesachats nvarchar(100))
    DECLARE C1 CURSOR FOR
    Select id_client
    from achat
    OPEN C1
    set @int=0
    FETCH NEXT FROM C1 into @int
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DECLARE @textok as nvarchar(100)
    DECLARE C2 CURSOR FOR
    Select achat_client from achat where id_client = @int
    set @textok = ''
    OPEN C2
    FETCH NEXT FROM C2 into @text
    IF @@FETCH_STATUS = 0
    BEGIN
    SET @textok=@text
    FETCH NEXT FROM C2 into @text
    END
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @textok=@textok+char(10)+@text
    FETCH NEXT FROM C2 INTO @text
    END
    CLOSE C2
    DEALLOCATE C2
    INSERT INTO @tab (id_client,lesachats) values (@int,@textok)
    FETCH NEXT FROM C1 into @int
    END
    CLOSE C1
    DEALLOCATE C1

    SELECT * from @tab as tab order by tab.id_client

    Si j'ai bien recopié le code on devrait avoir comme resultat

    001 | fleur
    002 | creme viande pain
    003 | chocolat

Discussions similaires

  1. Concatener plusieurs lignes en une selon condition
    Par budfox777 dans le forum Excel
    Réponses: 3
    Dernier message: 27/03/2012, 19h40
  2. Supprimer efficacement plusieurs entrées dans une ArrayList
    Par Djakisback dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 15/02/2011, 03h26
  3. Concatener plusieurs entrées
    Par kipy4 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/11/2009, 11h16
  4. Ajouter plusieurs entrées dans une table
    Par flab78 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2008, 16h17
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 14h55

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