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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    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 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    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 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    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...

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