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

SQL Oracle Discussion :

Grouper par id plus concaténation


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut Grouper par id plus concaténation
    Bonjour a tous,

    Oracle 10gR2

    Je voudrais savoir si c'est possible de regrouper des donner sur une seule ligne. voici l'exemple:

    soit la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
                pp.producto,
    			pp.grupo,
    			lower(gp.nombre) nombre,
    			pp.prioridad prioridad 
    FROM producto_prioridad_grupo pp
    NNER JOIN grupo_prioridad gp ON  pp.grupo=gp.grupo AND pp.producto='66639052'
    ORDER BY producto ;
    le resulta est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PRODUCTO GRUPO   NOMBRE                    PRIORIDAD                              
    66639052 32      orden_she_offers          1259                                   
    66639052 33      orden_she_offers_china    511                                    
    66639052 27      orden_she_outlet_china    1042                                   
    66639052 34      orden_she_outlet_usa      794                                    
    66639052 26      orden_touch_nuevo         32
    Je voudrais avec SQL pur ou PL/SQL arriver a ce resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PRODUCTO GRUPO  		 NOMBRE                    																				PRIORIDAD                              
    66639052 32,33,27,34,26  orden_she_offers,orden_she_offers_china,orden_she_outlet_china,orden_she_outlet_usa,orden_touch_nuevo	1259,511,1042,794,32
    Este possible?
    Si quelque'un a une idée ça serait genial, j'essaie de mon còté...
    D'avance merci

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut a tous,

    j'ai trouvé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select cast( multiSet( SELECT
                pp.producto,
    			pp.grupo,
    			lower(gp.nombre) nombre,
    			pp.prioridad prioridad 
    FROM producto_prioridad_grupo pp
    INNER JOIN grupo_prioridad gp ON  pp.grupo=gp.grupo AND pp.producto='66639052'
    ORDER BY producto ) as TStrings ) as LIST from dual;
    Mais j'ai l'ereur, invalid datatype sur TStrings ...

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    En 10g vous pouvez utiliser la fonction collect à la place de multiset mais le resultat est une collone de type nested table et non pas une chaine des caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select e.department_id, 
           cast(collect(to_char(e.employee_id) order by e.employee_id) as sys.odcivarchar2list) tab_id,
           cast(collect(e.first_name order by e.employee_id) as sys.odcivarchar2list) tab_name
      from hr.employees e
    group by e.department_id
    /

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut,
    merci pour ta reponse, si je transpose ta requete avec la mienne, ça me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT     pp.producto,
            pp.grupo,
           cast(collect(to_char(pp.producto) ORDER BY pp.producto) AS sys.odcivarchar2list) pp_id,
           cast(collect(pp.grupo ORDER BY pp.producto) AS sys.odcivarchar2list) pp_grupo
    FROM producto_prioridad_grupo pp
    INNER JOIN grupo_prioridad gp ON  pp.grupo=gp.grupo
    AND pp.producto='66639052'
    group by pp.producto;
    Mais j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Error] Execution (34: 13): ORA-00932: tipos de dato inconsistentes: se esperaba - se ha obtenido -

    J'ai aussi vu cette option avec LISTAGG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LISTAGG(pp.producto,',') WITHIN GROUP( ORDER BY pp.producto)
    FROM producto_prioridad_grupo pp
    INNER JOIN grupo_prioridad gp ON  pp.grupo=gp.grupo
    AND pp.producto='66639052';
    Mais la j'ai aussi une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00923: palabra clave FROM no encontrada donde se esperaba

    Je vois pas...

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    mon dieu je crois que j'ai reussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct(pp.producto),WM_CONCAT(pp.grupo) as grupo, WM_CONCAT(gp.nombre) as nombre, WM_CONCAT(pp.prioridad) as prioridad
    FROM mngbd.producto_prioridad_grupo pp
    INNER JOIN mngbd.grupo_prioridad gp ON  pp.grupo=gp.grupo AND pp.producto='66639052'
    group by pp.producto
    ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PRODUCTO GRUPO                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            NOMBRE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           PRIORIDAD                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    66639052 32,33,27,26,34                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ORDEN_SHE_OFFERS,ORDEN_SHE_OFFERS_CHINA,ORDEN_TOUCH_NUEVO,ORDEN_SHE_OUTLET_USA,ORDEN_SHE_OUTLET_CHINA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            1259,511,794,32,1322
    Vous validez? cette fonction c'est d'oracle? elle est stable et supportée?
    Car c'est pour monter a PROD dans le futur.
    D'avance merci

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Ufff
    Bon j'ai trouvé ça:
    https://forums.oracle.com/forums/thr...hreadID=896465

    pas bon, je dois utiliser une fonction documentée pour le passer a PROD.
    Si quelqu'un connait une autre forme de faire pareil, je suis prenneur.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut

    ok j'essaie la premiere option LISTAGG:

    la requete de l'exemple est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
    FROM   emp
    GROUP BY deptno;
    Voici la mienne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  id_producto, LISTAGG(idioma, ',') WITHIN GROUP (ORDER BY idioma) AS idiomas
    FROM producto_descripciones    
    WHERE id_producto = '83439761'  
    GROUP BY id_producto
    J'ai toujours l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Error] Execution (19: 50): ORA-00923: palabra clave FROM no encontrada donde se esperaba
    Etrange, je vois pas la difference.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    En même temps LISTAGG est présenté comme :
    LISTAGG Analystic Function in 11g Release 2
    Donc pas la bonne version.
    Utilise par exemple :
    ROW_NUMBER() and SYS_CONNECT_BY_PATH functions in Oracle 9i
    ou :
    COLLECT function in Oracle 10g
    comme proposé par mnitu

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut
    ok j'ai utilisé cette option sur 10g:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COLLECT function in Oracle 10g
    Ça marche ..sauf pour un champ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> desc producto_descripciones;
     Nombre                                    ┐Nulo?   Tipo
     ----------------------------------------- -------- ----------------------------
     ID_PRODUCTO                               NOT NULL VARCHAR2(8 CHAR)
     IDIOMA                                    NOT NULL VARCHAR2(2 CHAR)
     LINEA                                     NOT NULL NUMBER(38)
     TEXTO                                              NVARCHAR2(1200)
     ESTILO                                             VARCHAR2(2 CHAR)
    Devine lequel, TEXTO, NVARCHAR2(1200)
    ça laisse en blanc. Y'a un workaround pour ce cas?
    D'avance merci

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Rectification,
    si je lance la requete sous sql plus, je vois ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ID_PRODU
    --------
    TEXTO
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------
    83439761
     T r ┐ e r l o s e s ,   b e d r u c k t e s   K l e i d   a u s   C h i f f o n   m i t   d r a p i e r t e m   H a l s a u s s c h n i t t ,   g e s m o k t e m
    Le texte sort mais avec un espace entre chaque lettre.
    upsss

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bon y'a un autre probleme,

    a la fin j'ai utilisé cette fonction:

    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
    CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000);
    /
     
    CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab  IN  t_varchar2_tab,
                                              p_delimiter     IN  VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
      l_string     VARCHAR2(32767);
    BEGIN
      FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
        IF i != p_varchar2_tab.FIRST THEN
          l_string := l_string || p_delimiter;
        END IF;
        l_string := l_string || p_varchar2_tab(i);
      END LOOP;
      RETURN l_string;
    END tab_to_string;
    /
    Vue sur cette page:
    http://www.oracle-base.com/articles/...techniques.php

    Mais, c'est limité a 32767 et j'ai des erreurs car certaines données depasse. Que faire dans ce cas?
    Je vais essayer avec cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROW_NUMBER() and SYS_CONNECT_BY_PATH functions in Oracle 9i

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bon la je coince...Dommage j'etais si pret du but.
    Pourquoi on peu pas remplacer le varchar2 par un long?
    ça resoudrait mon probleme

Discussions similaires

  1. grouper par la plus grande occurence d'un champ
    Par nimwak dans le forum Requêtes
    Réponses: 0
    Dernier message: 04/05/2009, 15h59
  2. grouper par trimestre
    Par lazzeroni dans le forum Oracle
    Réponses: 3
    Dernier message: 30/05/2006, 16h18
  3. Réponses: 2
    Dernier message: 13/04/2006, 17h09
  4. Debutant - Requête Grouper par Date
    Par ghan77 dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/12/2005, 18h07
  5. grouper par une partie d'attribut
    Par vplf dans le forum Langage SQL
    Réponses: 19
    Dernier message: 21/01/2005, 17h31

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