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 :

Select SQL Oracle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut Select SQL Oracle
    Bonjour à tous,

    Je travaille sur une requête SQL pour un KPI à partir d'une table d'historique (ex : HisTable), supposant que cette table contient les données dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    NumSeq || articleID ||  Statut  || Date_Action
    ______ || _________ || ________ || ___________
       1   || 111       || Submit   ||  20/12/2017
       2   || 111       || Approuve ||  28/12/2017
       3   || 111       || Approuve ||  04/01/2018
       4   || 111       || Accept   ||  10/01/2018
       1   || 222       || Submit   ||  02/01/2018
       2   || 222       || Approuve ||  03/01/2018
       3   || 222       || Accept   ||  20/01/2018
       4   || 222       || Approuve ||  24/01/2018
       1   || 333       || Submit   ||  25/12/2017
       2   || 333       || Approuve ||  07/01/2018
       3   || 333       || Approuve ||  15/01/2018
    Il peut avoir d'autres statuts "Approuve" après l'acceptation sur l'article.

    L'objectif est d'afficher pour article, la dernière (récente) date d'approbation avant la date d'acceptation s'elle existe, et la date d'acceptation s'il existe sinon un champs null.

    Pour faire simple, y'a deux cas à traiter :
    - Si le statut "Accept" pour l'article existe : on affiche articleID + date dernière approbation (Accept) avant la date d'acceptation + la date d'acceptation.
    - Si le statut "Accept" n'existe pas encore : on afficher articleId + date dernière approbation + NULL (date acceptation = NULL).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    articleID || Date_Action_Appr || Date_Action_Accep
    _________ || ________________ || _________________
     111      ||  04/01/2018      ||    10/01/2018 
     222      ||  03/01/2018      ||    20/01/2018
     222      ||  15/01/2018      ||
    j'ai réussi à afficher les deux articles accepté et je n'ai pas réussi à afficher le troisième qui n'est pas encore accepté.

    Toute aide est précieux et je vous en remercie d'avance.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Tu as fait une erreur dans le résultat attendu, la dernière ligne c'est l'article 333 et pas 222
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    articleID|| Date_Action_Appr || Date_Action_Accep
    ________ ||_________________|| ______________
    111      || 04/01/2018      || 10/01/2018
    222      || 03/01/2018      || 20/01/2018
    222      || 15/01/2018      ||

    Si j'ai bien compris, il faut que l'article ait au moins une ligne 'approuve' ou une ligne 'accept' pour ressortir, et que tu n'as besoin que des données de ces lignes, donc il suffit déjà de limiter à ces 2 états

    Ensuite, un simple groupement avec un max suffit (+ decode)

    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
    WITH T AS
    (SELECT 1 numseq,  111 idart, 'Submit' action, TO_DATE('20/12/2017', 'DD/MM/RRRR') dteaction FROM DUAL            
    UNION ALL SELECT 2 numseq,  111 idart, 'Approuve' action, TO_DATE('28/12/2017', 'DD/MM/RRRR') dteaction FROM DUAL
    UNION ALL SELECT 3 numseq,  111 idart, 'Approuve' action, TO_DATE('04/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL
    UNION ALL SELECT 4 numseq,  111 idart, 'Accept' action, TO_DATE('10/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL  
    UNION ALL SELECT 1 numseq,  222 idart, 'Submit' action, TO_DATE('02/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL  
    UNION ALL SELECT 2 numseq,  222 idart, 'Approuve' action, TO_DATE('03/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL
    UNION ALL SELECT 3 numseq,  222 idart, 'Accept' action, TO_DATE('20/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL  
    UNION ALL SELECT 4 numseq,  222 idart, 'Approuve' action, TO_DATE('24/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL
    UNION ALL SELECT 1 numseq,  333 idart, 'Submit' action, TO_DATE('25/12/2017', 'DD/MM/RRRR') dteaction FROM DUAL  
    UNION ALL SELECT 2 numseq,  333 idart, 'Approuve' action, TO_DATE('07/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL
    UNION ALL SELECT 3 numseq,  333 idart, 'Approuve' action, TO_DATE('15/01/2018', 'DD/MM/RRRR') dteaction FROM DUAL
    )
    SELECT idart, MAX(DECODE(action, 'Approuve', dteaction)) last_approb, MAX(DECODE(action, 'Accept', dteaction))  last_accept
    FROM T
    WHERE action IN ('Approuve', 'Accept')
    GROUP BY idart
    ORDER BY 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IDART	LAST_APPROB	LAST_ACCEPT
    111	04/01/2018	10/01/2018
    222	24/01/2018	20/01/2018
    333	15/01/2018

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Bonjour McM,

    Merci pour ta réponse. Effectivement j'ai fais une erreur, c'est bien 333 et pas 222.

    En fait, tous les articles ont le statut 'approuve' contrairement au statut 'accept' (par exemple, des commandes qui sont en cours de traitement sont en attente d'acceptation).

    Pour ta requête, au niveau de la première partie t'as utilisé des valeurs en dur et ce n'est pas ce que je voulais. La requête que j'ai fais au début qui permet d'afficher juste les articles acceptés est celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select HT1.articleID , HT1.Date_Action as Date_Action_Appr, HT2.Date_Action as Date_Action_Accep from HisTable HT1
    join HisTable HT2 on (HT1.articleID = HT2.articleID) 
    where HT1.Statut ='Approuve'
    and HT2.Statut = 'Accept'
    and HT1.NumSeq = HT2.NumSeq - 1
    Mais je voudrais bien afficher les articles en attente d'acceptation, pas que ceux qui sont acceptés.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ma première partie (WITH T..) constitue simplement un jeu de données

    Avec ce SELECT tu devrais avoir le résultat réel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT articleID, MAX(DECODE(Statut , 'Approuve', Date_Action)) Date_Action_Appr, MAX(DECODE(Statut , 'Accept', Date_Action))  Date_Action_Accep
    FROM HisTable
    WHERE Statut IN ('Approuve', 'Accept')
    GROUP BY articleID
    ORDER BY articleID

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    j'ai testé la requête, c'est presque bon, merci.

    Il y'a un petit souci au niveau de l'articleid 222, si on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(DECODE(Statut , 'Approuve', Date_Action))
    on affiche la date du dernier statut 'Approuve' (numseq = 4) qui vient après l'e statut 'Accept' alors qu'il faut prendre la date du statut 'Approuve' de numseq = 2 (en gros il faut prendre la date du statut 'Approuve' avant l'acceptation == dans le cas au ou l'acceptation est faite).
    Le souci est que si on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MIN(DECODE(Statut , 'Approuve', Date_Action))
    , au niveau de l'articleid 111 on affichera la date de numseq = 2 au lieu de la date du numseq = 3

  6. #6
    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
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        select t1.articleId
             , max(t1.date_action) as Date_Action_Appr
             , t2.date_action      as Date_Action_Accep 
          from HisTable t1
     left join HisTable t2  on t2.articleId    = t1.articleId
                           and t2.date_action >= t1.date_action
                           and t2.Statut       = 'Accept'
         where t1.Statut = 'Approuve'
      group by t1.articleId
             , t2.date_action;
    Edit : il y a encore un petit truc à résoudre, j'y reviendrai.

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

Discussions similaires

  1. [MySQL] aide sur un select
    Par nebil dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/06/2006, 12h54
  2. besoin d'aide sur programme en sql 3
    Par abdel54 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/12/2005, 09h19
  3. Besoin d'aide sur un script SQL de recherche
    Par agougeon dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/10/2005, 11h40
  4. besoin d'aide sur une requette sql
    Par maxidoove dans le forum Langage SQL
    Réponses: 13
    Dernier message: 10/10/2005, 18h42
  5. [intermedia] besoin d'aide sur script PL/SQL
    Par SteelBox dans le forum PL/SQL
    Réponses: 8
    Dernier message: 05/01/2004, 19h59

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