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 :

Selection d'un enregistrement ayant la date minimum dans un intervalle


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 45
    Points
    45
    Par défaut Selection d'un enregistrement ayant la date minimum dans un intervalle
    Bonjour à tous,

    On a un petit problème de sélection que nous n'arrivons pas à régler. Un exemple valant plus que des paroles, voici ce que nous cherchons.

    On a une table COMMANDE contenant les champs suivants :

    NUMERO_CLIENT | REFERENCE | CODE_PRODUIT | STATUS   | DATE_COMMANDE |
    
    1005500001    | BROYEUR01 | 15800A92007  | DELIVRE  | 12/04/2013    |
    1005500001    | BROYEUR01 | 15800A92008  | DELIVRE  | 13/05/2013    |
    1005500001    | BROYEUR01 | 15800A92009  | ENCOURS  | 24/06/2013    |
    1005500001    | MIXEUR01  | 15800A92007  | DELIVRE  | 12/04/2013    |
    1005500001    | MIXEUR01  | 15800A92008  | DELIVRE  | 14/05/2013    |
    1005500001    | MIXEUR01  | 15800A92009  | ENCOURS  | 24/06/2013    |
    
    1005500002    | BROYEUR01 | 15800A90025  | DELIVRE  | 12/04/2013    |
    1005500002    | BROYEUR01 | 15800A97777  | DELIVRE  | 15/05/2013    |
    1005500002    | BROYEUR01 | 15800A98174  | ENCOURS  | 24/06/2013    |
    1005500002    | MIXEUR04  | 15800A90025  | DELIVRE  | 12/04/2013    |
    1005500002    | MIXEUR04  | 15800A97777  | DELIVRE  | 16/05/2013    |
    1005500002    | MIXEUR04  | 15800A98174  | ENCOURS  | 24/06/2013    |
    Une vue est créée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace view V1 as
      select 
        NUMERO_CLIENT
        REFERENCE
        CODE_PRODUIT
        STATUS
        DATE_COMMANDE
      from COMMANDE ;
    Ce que nous voulons faire c'est récupérer la date minimum de commande pour chaque référence donnée et chaque n° client et ceci dans un intervalle
    de date en utilisant obligatoirement la vue.

    Par exemple, un select sur V1 where date_commande between 20/04/2013 et le 30/06/2013
    qui me renverrait seulement les lignes suivantes :

    1005500001    | BROYEUR01 | 15800A92008  | DELIVRE  | 13/05/2013    |
    1005500001    | MIXEUR01  | 15800A92008  | DELIVRE  | 14/05/2013    |
    1005500002    | BROYEUR01 | 15800A97777  | DELIVRE  | 15/05/2013    |
    1005500002    | MIXEUR04  | 15800A97777  | DELIVRE  | 16/05/2013    |
    c'est à dire la ligne contenant la date la plus petite par NUMERO_CLIENT et REFERENCE.

    On a essayé des GROUP BY dans tous les sens mais ca ne marche jamais.

    On ne peut pas utiliser de Procedures oracle car cette vue est utilisée dans un rapport YellowFin et donc aucune possibilité de faire des exec. Seules les fonctions peuvent être utilisées.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    la date minimum de commande pour chaque référence donnée et chaque n° client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      min(DATE_COMMANDE)over(partition by NUMERO_CLIENT,REFERENCE)
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par foster06 Voir le message
    ...On a essayé des GROUP BY dans tous les sens mais ca ne marche jamais.
    ....
    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
    35
    36
    37
    38
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With Commande As (
      2    Select '1005500001' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A92007' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('12/04/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      3    Select '1005500001' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A92008' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('13/05/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      4    Select '1005500001' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A92009' CODE_PRODUIT, 'ENCOURS' STATUS, To_Date('24/06/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      5    Select '1005500001' NUMERO_CLIENT, 'MIXEUR01' REFERENCE, '15800A92007' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('12/04/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      6    Select '1005500001' NUMERO_CLIENT, 'MIXEUR01' REFERENCE, '15800A92008' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('14/05/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      7    Select '1005500001' NUMERO_CLIENT, 'MIXEUR01' REFERENCE, '15800A92009' CODE_PRODUIT, 'ENCOURS' STATUS, To_Date('24/06/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      8    Select '1005500002' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A90025' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('12/04/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
      9    Select '1005500002' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A97777' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('15/05/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
     10    Select '1005500002' NUMERO_CLIENT, 'BROYEUR01' REFERENCE, '15800A98174' CODE_PRODUIT, 'ENCOURS' STATUS, To_Date('24/06/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
     11    Select '1005500002' NUMERO_CLIENT, 'MIXEUR04' REFERENCE, '15800A90025' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('12/04/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
     12    Select '1005500002' NUMERO_CLIENT, 'MIXEUR04' REFERENCE, '15800A97777' CODE_PRODUIT, 'DELIVRE' STATUS, To_Date('16/05/2013','DD/MM/YYYY') DATE_COMMANDE From dual union all
     13    Select '1005500002' NUMERO_CLIENT, 'MIXEUR04' REFERENCE, '15800A98174' CODE_PRODUIT, 'ENCOURS' STATUS, To_Date('24/06/2013','DD/MM/YYYY') DATE_COMMANDE From dual
     14  )
     15  Select NUMERO_CLIENT,
     16         REFERENCE,
     17         Min(CODE_PRODUIT) Keep (Dense_Rank First Order by DATE_COMMANDE) As CODE_PRODUIT,
     18         Min(STATUS) Keep (Dense_Rank First Order by DATE_COMMANDE) As STATUS,
     19         Min(DATE_COMMANDE)
     20    From Commande
     21   Where date_commande between To_Date('20/04/2013','DD/MM/YYYY') And to_date('30/06/2013','DD/MM/YYYY')
     22    Group By NUMERO_CLIENT, REFERENCE
     23    Order By NUMERO_CLIENT, REFERENCE
     24  /
     
    NUMERO_CLIENT REFERENCE CODE_PRODUIT STATUS  MIN(DATE_COMMANDE)
    ------------- --------- ------------ ------- ------------------
    1005500001    BROYEUR01 15800A92008  DELIVRE 13/05/2013
    1005500001    MIXEUR01  15800A92008  DELIVRE 14/05/2013
    1005500002    BROYEUR01 15800A97777  DELIVRE 15/05/2013
    1005500002    MIXEUR04  15800A97777  DELIVRE 16/05/2013
     
    SQL>

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Sinon aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM 
      (SELECT v1.*, row_number() over(partition by numero_client, reference order by date_commande) rn
      WHERE date_commande between To_Date('20/04/2013','DD/MM/YYYY') AND to_date('30/06/2013','DD/MM/YYYY')
    )
    where rn = 1

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/10/2014, 22h29
  2. [AC-2010] Date minimum dans requête
    Par Maxhouss dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/03/2013, 18h10
  3. [XL-2003] vérifier si heure + date est dans l'intervalle
    Par dawood dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/05/2009, 17h46
  4. Réponses: 2
    Dernier message: 03/02/2007, 15h35
  5. Réponses: 3
    Dernier message: 11/01/2007, 15h44

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