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 et group by


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut Concat et group by
    Bonjour, j’ai le tableau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Code 	date achat	Type1	Type2	Type3	Type4
    x1	01/01/2001	produit1	 	 	 
    x1	01/01/2001	 	produit2	 	 
    x1	01/01/2001	 	 	 	produit4
    x1	02/01/2002	 	produit2	 	 
    x2	03/02/2001	 	produit2	 	 
    x2	03/02/2001	 	 	 	produit4
    x3	04/09/2008	 	 	produit3	 
    x3	04/09/2008	 	produit2	 	 
    x3	04/09/2008	 	 	 	produit4
    X4	14/10/2008	 	 	produit3
    Et je voudrais effectuer un traitement SQL pour obtenir le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Code client         date achat	Type_produit 
    x1	           01/01/2001	produit1 ; produit2 ; produit4 
    x1	           02/01/2002	produit2 
    x2	           03/02/2001	produit2 ; produit4
    x3	           04/09/2008	produit2 ; produit3 ; produit4
    X4	           14/10/2008	produit3
    J’ai réalisé ce code qui ne fonctionne pas correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
    Code client,
    date achat,
    Type1|| ; || Type2|| ; || Type3|| ; || Type4 as Type_produit
    From ma_table
    Group by Code client
    Cette rquête ne semble pas fonctionner correctement.
    Quelqu’un a-t-il une idée ?

    Merci d’avance.

    ps : n'hésitez pas à me poser des questions si mon exemple ne semble pas clair

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    sur quel SGBD tu travailles?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    J'ai importé un fichier texte et je fais du proc SQL sous SAS... :s
    Pourquoi ?
    Le code semble-t-il correcte?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Est-ce que lorsque type1 n'est pas renseigné c'est une chaine vide ou un NULL
    Si c'est null, après concaténation tu obtiendras NULL.
    Dans cette hypothèse il faut utiliser une fonction de type valeur si null la fonction normalisée est COALESCE.
    De plus tu voulais concaténer avec la chaine ; mais tu as oublié les quotes.
    Si l'opérateur de concaténation de ton SGBD est bien ||
    cela nous donne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    Code client,
    date achat,
    Coalesce(Type1,'')|| ';' || Coalesce(Type2,'')|| ';' || Coalesce(Type3,'')|| ';' || Coalesce(Type4,'') AS Type_produit
    FROM ma_table
    GROUP BY Code client
    Ps comme demandé par Cybher connaître ton SGBD nous aiderait à t'aider!
    A+
    Soazig

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Bonjour, quand j'utilise la fonction Coalesce, j'obtient le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Code client	date achat	Type produit1
    x1	             01/01/2001	produit1
    x1	             01/01/2001	;produit2
    x1	             01/01/2001	;;;produit4
    x1	             02/01/2002	;produit2
    x2	             03/02/2001	;produit2
    x2	             03/02/2001	;;;produit4
    x3	             04/09/2008	;;produit3
    x3	             04/09/2008	;produit2
    x3	             04/09/2008	;;;;produit4
    x5	             14/10/2008	;;produit3
    sinon, quand j'utilise le || classique, 'ai le message d'erreur suivant : "impossible de déterminer LINE et COLUMN."

    PS : lorsque le type1 2 ou 3 n'est pas renseigné, j'aimerais que le délimiteur ne soit pas pris en compte...

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pour arriver a vos fins par requete SQL, vous allez devoir pondre une usine a gaz, difficilement maintenable et peu evolutive. C'est de l'ordre du cosmetique, ce qui n'est pas la fonction premiere de SQL. Le mieux est d'utiliser un client pour mettre en forme les données extraites de votre base.

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Dans la mesure où ton nombre de colonnes est fixe, tu peux faire 4 jointures.
    Si tu garantis qu'une et une seule colonne est non nulle pour une ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT letrucquivabien
    FROM tatable A
    JOIN tatable B ON a.id = b.id  AND b.txt2 IS NOT NULL
    JOIN tatable C ON a.id = c.id AND c.txt3 IS NOT NULL
    JOIN tatable D ON a.id = d.id AND d.txt4 IS NOT NULL
    WHERE a.txt1 IS NOT NULL
    C'est en gros. Tu verras pour la finition...

    Au passage, ton modèle doit de données ne doit pas être fantastique (genre pas "normal")...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Merci pour votre aide ! C'est vraiment sympa.

    J'aurais voulu savoir : si j'avais le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Code client	date achat	Type_produit
    x1	             01/01/2001	produit1
    x1	             01/01/2001	produit2
    x1	             01/01/2001	produit4
    x1	             02/01/2002	produit2
    x2	             03/02/2001	produit2
    x2	             03/02/2001	produit4
    x3	             04/09/2008	produit3
    x3	             04/09/2008	produit2
    x3	             04/09/2008	produit4
    x5	             14/10/2008	produit3
    Est-ce qu'il me serait possible d'obtenir le résultat ci-dessous ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Code client	date achat	Type produit 
    x1	             01/01/2001	produit1, produit2, produit4 
    x1	             02/01/2002	produit2
    x2	             03/02/2001	produit2, produit4
    x3	             04/09/2008	produit2, produit3, produit4
    x5	             14/10/2008	produit3
    Si quelqu'un a une idée de code, je suis preneur
    Merci d'avance !

  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
    C'est sans doute possible, mais je ne connais pas grand chose des possibilités de SAS Proc SQL.
    Fais des recherches sur les methodes d'aggregation de chaines de caractères (string aggregation techniques), par exemple un recueil de methodes pour Oracle qui te donnera peut etre des idées : http://www.oracle-base.com/articles/...cific_function

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Eh bien en fait, c'est du SQL classique...
    C'est pour ça que si quelqu'un a une solution de requête SQL je suis preneur !

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Si c'est du SQL normalisé, malheureusement pour toi il n'existe pas de fonction de ce type dans la norme ANSI
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  12. #12
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Comme je vous l'avais indiqué précédement, vous allez vers une voie sans issue... SQL n'est pas fait pour faire de la mise en forme.

    Ou alors, passez par des procedures stockées

    Il y aura toujours quelqu'un pour vous donner une solution avec une requete complexe et peu evolutive, et cette personne ne sera pas la lorsque votre boss fera evoluer votre cahier de spec et qu'il faudra tout reecrire ...


    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

Discussions similaires

  1. GROUP CONCAT: condition
    Par David55 dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/12/2010, 16h14
  2. question sur GROUP CONCAT
    Par Dranak dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/07/2008, 16h04
  3. Group by et concat!
    Par tinmarbusir dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/05/2008, 11h17
  4. Remplacer un group concat
    Par pmithrandir dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/02/2008, 11h50
  5. requète GROUP BY CONCAT
    Par the_nul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/11/2006, 23h38

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