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 :

[Oracle 9i] Regroupement ou tri personnalisé


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Par défaut [Oracle 9i] Regroupement ou tri personnalisé
    Bonjour,

    Je cherche depuis un petit moment comment rédiger une requête SQL suite à une demande bien précise. Je ne trouve rien de satisfaisant dans les recherches sur Internet.

    On a par exemple les données suivantes :
    - table TEST_TYPES :
    ID_TYPE LIB_TYPE PRIORITE
    A Test 1 1
    B Test 2 3
    C Test 3 2

    - table TEST_CLI :
    ID_CLI ID_TYPE MONTANT
    123 B 400
    234 A 16
    234 B 16
    345 C 0
    456 C 0

    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
     
        create table test_types as (
            select 'A' ID_TYPE, 'Test 1' LIB_TYPE, 1 PRIORITE from dual
            union
            select 'B' ID_TYPE, 'Test 2' LIB_TYPE, 3 PRIORITE from dual
            union
            select 'C' ID_TYPE, 'Test 3' LIB_TYPE, 2 PRIORITE from dual);
     
        create table test_cli as (
            select 123 ID_CLI, 'B' ID_TYPE, 400 MONTANT from dual
            union
            select 234 ID_CLI, 'B' ID_TYPE, 16 MONTANT from dual
            union
            select 234 ID_CLI, 'A' ID_TYPE, 16 MONTANT from dual
            union
            select 345 ID_CLI, 'C' ID_TYPE, 0 MONTANT from dual
            union
            select 456 ID_CLI, 'C' ID_TYPE, 0 MONTANT from dual);
    La requête actuelle est de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select T.PRIORITE,
           C.ID_CLI,
           T.LIB_TYPE,
           C.MONTANT
    from TEST_CLI C inner join TEST_TYPES T
             on T.ID_TYPE = C.ID_TYPE
    order by T.PRIORITE asc, C.MONTANT desc, C.ID_CLI asc
    Elle retourne :

    PRIORITE ID_CLI LIB_TYPE MONTANT
    1 234 Test 1 16
    2 345 Test 3 0
    2 456 Test 3 0
    3 123 Test 2 400
    3 234 Test 2 16

    -> il faut trier les lignes par priorité (asc) et montant (desc)

    La demande qui m'a été faite doit retourner ceci :

    PRIORITE ID_CLI LIB_TYPE MONTANT
    1 234 Test 1 16
    3 234 Test 2 16
    2 345 Test 3 0
    2 456 Test 3 0
    3 123 Test 2 400

    -> il faut toujours trier les lignes par priorité (asc) et montant (desc) mais si on a un client avec plusieurs priorités, il faut ramener ses lignes par priorité, puis reprendre le tri normal pour le reste du résultat.

    NB : il n'est pas nécessaire de ramener la priorité mais elle fait partie du tri.
    En réel j'ai beaucoup plus d'infos mais elles ne sont pas utiles au tri.

    J'ai essayé diverses fonctions analytiques, de tri, de groupe, ... mais je n'arrive à rien de proche. Je m'y prends peut-être mal.

    Quelqu'un a une idée ? Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Par défaut
    Une solution d'un collègue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
        (select min(T1.PRIORITE) 
        from TEST_TYPES T1 
            inner join TEST_CLI T2 
                on T1.ID_TYPE = T2.ID_TYPE
        where T2.ID_CLI = C.ID_CLI) PRIORITE_BIS, 
        T.PRIORITE,
        C.ID_CLI,
        T.LIB_TYPE,
        C.MONTANT
    FROM TEST_CLI C INNER JOIN TEST_TYPES T
             ON T.ID_TYPE = C.ID_TYPE
    ORDER BY PRIORITE_BIS, T.PRIORITE ASC, C.MONTANT DESC, C.ID_CLI ASC

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous n'étiez pas très loin de la solution :
    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
      SELECT T.PRIORITE,
             C.ID_CLI,
             T.LIB_TYPE,
             C.MONTANT
        FROM TEST_CLI C
             INNER JOIN TEST_TYPES T
               ON T.ID_TYPE = C.ID_TYPE
    ORDER BY COUNT(*) OVER(PARTITION BY C.ID_CLI) DESC,
             T.PRIORITE ASC, C.MONTANT DESC, C.ID_CLI ASC;
     
    PRIORITE  ID_CLI  LIB_TYPE  MONTANT
    --------  ------  --------  -------
           1     234    Test 1       16
           3     234    Test 2       16
           2     345    Test 3        0
           2     456    Test 3        0
           3     123    Test 2      400

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 18
    Par défaut
    Merci !
    Bizarre je n'ai pas reçu de notification...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Tri personnalisé des résultats d'une requête MySQL
    Par Tibimac dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 25/09/2010, 14h09
  2. Regroupement et tri sur champ différents
    Par Dertron dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/10/2008, 17h56
  3. Tri personnalisé qui se lance tout seul
    Par zert84 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/09/2008, 12h35
  4. probleme de regroupement et tri
    Par nathalie35 dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/02/2007, 12h15
  5. [XSLT] Regroupement et tri d'un XML selon un attribut
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 25/01/2007, 11h18

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