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 :

Regroupement d'un set de données commun


Sujet :

SQL Oracle

  1. #1
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut Regroupement d'un set de données commun
    Bonjour,
    je bute actuellement sur l'écriture d'une requête et commençait à me demander si je devais passer par l'écriture d'une fonction pl/sql plutôt qu'une requête.



    J'ai en entrée une table d'achat comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ORDER_ID PRODUIT_ID  PRODUIT_QUANTITE 
    -----------------------------------------
    1	  1	        2
    1	  2            3
     
    2	  1	       2
    2	  2            3
     
    3 	  1		2
    j'essaye de trouver un requête qui me permette de regrouper un ensemble d'achat comportant exactement les mêmes quantités
    des mêmes produits pour avoir le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ORDER_ID_COMPUTED  PRODUIT_ID  PRODUIT_QUANTITE 
    ------------------------------------------------
    1-2	  		1		2
    1-2	  		2              3
     
    3			1		2
    Voyez-vous un moyen de la faire ?

    Merci pour votre aide,
    Lek

  2. #2
    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 780
    Points
    30 780
    Par défaut
    Regarde du côté de la fonction LISTAGG...
    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.

  3. #3
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Merci,
    j'ai essayé mais cela ne fonctionne pas, le regroupement ne se fait pas sur le bon ensemble :

    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
     
    with achat  as
    (
     select 1	ORDER_ID,  1	 PRODUIT_ID,       2 PRODUIT_QUANTITE from dual
     UNION
     select 1	ORDER_ID,  2	 PRODUIT_ID,       3 PRODUIT_QUANTITE from dual
     UNION
      select 2	ORDER_ID,  1	 PRODUIT_ID,       2 PRODUIT_QUANTITE from dual
      UNION
        select 2	ORDER_ID,  2	 PRODUIT_ID,       3 PRODUIT_QUANTITE from dual
      UNION
      select 3	ORDER_ID,  1	 PRODUIT_ID,       2 PRODUIT_QUANTITE from dual
    )
    SELECT  distinct LISTAGG(ORDER_ID, '-') WITHIN GROUP (ORDER BY ORDER_ID)
    OVER (PARTITION BY PRODUIT_ID,PRODUIT_QUANTITE)
    ORDER_ID_COMPUTED,PRODUIT_ID,PRODUIT_QUANTITE
    FROM achat
    Me donne en résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ORDER_ID_COMPUTED  PRODUIT_ID  PRODUIT_QUANTITE 
    ----------------------------------------------------------------
    1-2	                              2                    3
    1-2-3	                              1                    2
    Donc pas exactement le résultat souhaité :-(
    Me suis-je trompé dans ma clause de partition ?

    Merci encore.

  4. #4
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Désolé de revenir,
    sur le sujet mais je ne vois vraiment pas comment regrouper mon ensemble d'achat comportant les mêmes éléments en nombre et quantité...
    Je viens de passer en revue les fonctions de grouping (rollup, cube, grouping sets etc...) mais aucune de ces fonctionnalités ne semblent adaptée...
    J'aimerais seulement savoir si je m'acharne pour rien car ce ne serait pas faisable avec une requête oracle ....

  5. #5
    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 780
    Points
    30 780
    Par défaut
    Il faut alors passer par une division relationnelle.
    Cette requête (à vérifier) devrait te retourner des couples de order_id ayant au moins un (produit_id, produit_qte) en commun et aucun (produit_id, produit_qte) propre à l'un des deux.
    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
    select  distinct
            tb1.order_id
        ,   tb2.order_id
    from    achat   tb1
        inner join
            achat   tb2
            on  tb1.order_id    < tb2.order_id
            and tb1.produit_id  = tb1.produit_id
            and tb1.produit_qte = tb1.produit_qte
    where   not exists  
            (   select  null
                from    achat   ln1
                where   ln1.order_id    = tb1.order_id
                    and not exists
                        (   select  null
                            from    achat   ln2
                            where   ln2.order_id    = tb2.order_id
                                and ln2.produit_id  = ln1.produit_id
                                and ln2.produit_qte = ln1.produit_qte
                        ) 
            )
        and not exists  
            (   select  null
                from    achat   ln2
                where   ln2.order_id    = tb2.order_id
                    and not exists
                        (   select  null
                            from    achat   ln1
                            where   ln1.order_id    = tb1.order_id
                                and ln1.produit_id  = ln2.produit_id
                                and ln1.produit_qte = ln2.produit_qte
                        ) 
            )
    ;
    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.

  6. #6
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Merci pour ta réponse,
    en corrigeant la jointure inner join la requête me remonte bien le couple d'order_id que tu mentionnes (c'est à dire dans mon cas 1 et 2) mais ne répond pas complètement à ma problématique...
    Je vois peut-être une manière d'arriver à mon résultat mais je n'arrive pas à écrire la requête :
    - J'imagine que je peux me servir de rank() pour mettre un poids de regroupement sur tous les achats portant sur le même groupe de produit_id, quantité
    - ensuite j'essaye de faire un listagg des order_id de même poids...

    Dans l'idée je pense que cela devrait marcher mais je batailles encore sur ma requête...

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Un truc comme ca ?:
    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
     
    WITH src
            AS (SELECT 1 ORDER_ID, 1 PRODUIT_ID, 2 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 1 ORDER_ID, 2 PRODUIT_ID, 3 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 2 ORDER_ID, 1 PRODUIT_ID, 2 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 2 ORDER_ID, 2 PRODUIT_ID, 3 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 3 ORDER_ID, 1 PRODUIT_ID, 2 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 4 ORDER_ID, 3 PRODUIT_ID, 20 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 5 ORDER_ID, 12 PRODUIT_ID, 30 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 6 ORDER_ID, 12 PRODUIT_ID, 50 PRODUIT_QUANTITE FROM DUAL
                UNION
                SELECT 7 ORDER_ID, 12 PRODUIT_ID, 30 PRODUIT_QUANTITE FROM DUAL)
      SELECT produit_id
           , produit_quantite
           , LISTAGG (order_id_to_concat, '-') WITHIN GROUP (ORDER BY produit_id, produit_quantite, order_id_to_concat) ORDER_ID_COMPUTED
        FROM (  SELECT a.produit_id, a.produit_quantite, b.order_id order_id_to_concat
                  FROM src a, src b
                 WHERE a.produit_id = b.produit_id(+) AND a.produit_quantite = b.produit_quantite(+)
              GROUP BY a.produit_id, a.produit_quantite, b.order_id)
    GROUP BY produit_id, produit_quantite
    ORDER BY 1, 2
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

Discussions similaires

  1. [Designer V5-V6] Liaisons incorrectes sur des données communes
    Par tang121 dans le forum Débuter
    Réponses: 15
    Dernier message: 06/07/2010, 16h14
  2. Problème pour trouver les données commune dans une requête
    Par Winterrage dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/02/2008, 10h14
  3. concatener 2 feuilles de données ayant des données communes
    Par azzar dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 31/01/2008, 22h52
  4. Incorporation d’un sous rapport dans un rapport, sans données communes
    Par sgrosjean94 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/09/2006, 12h05
  5. Réponses: 5
    Dernier message: 15/07/2005, 11h25

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