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 last date by group if [10gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 34
    Par défaut Select last date by group if
    Bonjour,
    je suis embêté pour réaliser ma requête.

    - Une seule table
    - Plusieurs enregistrements pour un même champ ID
    - Chaque ID à un statut (BLO pour bloqué ou DIS pour disponible ou DLS pour date limite de stockage) et une date correspondant à l'application du statut.
    - Un ID bloqué peut redevenir disponible auquel cas il n'est donc plus bloqué.

    Je voudrais sélectionner les ID qui sont bloqués.
    C'est à dire avec statut = 'BLO' mais à condition que sa date de statut > date de statut 'DIS' pour ce même ID.

    Exemple 1 :
    ID1 DIS 23/05/2015
    ID1 BLO 24/05/2015
    ID1 DIS 25/05/2015
    ID1 BLO 26/05/2015
    ID1 DIS 27/05/2015
    Dans cet exemple 1, je ne retiens pas l'ID1 car il n'est pas bloqué. Il l'a été mais depuis le 27/05/2015 il est de nouveau disponible.

    Exemple 2 :
    ID2 DIS 23/05/2015
    ID2 BLO 24/05/2015
    ID2 DIS 25/05/2015
    ID2 BLO 26/05/2015
    ID2 DLS 27/05/2015
    Ici, la requête devra renvoyer "ID2 BLO 26/05/2015" vu qu'en dernière date, mise à part avec le statut DLS, il est bloqué.

    J'espère que c'est compréhensible.
    Merci à vous

  2. #2
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    C'est marrant, car à la facon dont vous ennoncez cela, avec un interpreteur de texte, on pourrait carrement écrire la requete directement.

    En formulant votre problème, vous avez formulé la requête :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select A.ID 
    FROM MATABLE A
    WHERE A.STATUS = 'BLO'
    AND NOT EXISTS	(	SELECT 1
    			FROM MATABLE
    			WHERE	A.ID = B.ID
    			AND B.STATUS = 'DIS'
    			AND A.DATE_STATUS < B.DATE_STATUS 
    		)

  3. #3
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mazu29 Voir le message
    ...
    - Une seule table
    - Plusieurs enregistrements pour un même champ ID
    - Chaque ID à un statut (BLO pour bloqué ou DIS pour disponible ou DLS pour date limite de stockage) et une date correspondant à l'application du statut.
    ...
    C'est à dire avec statut = 'BLO' mais à condition que sa date de statut > date de statut 'DIS' pour ce même ID.
    Cherchez sur ce forum First/Last dans leur version agrégée.
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
     
    SQL> 
    SQL> With Data As (
      2    Select 'ID1' As id, 'DIS' as statut, to_date('23/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      3    Select 'ID1' As id, 'BLO' as statut, to_date('24/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      4    Select 'ID1' As id, 'DIS' as statut, to_date('25/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      5    Select 'ID1' As id, 'BLO' as statut, to_date('26/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      6    Select 'ID1' As id, 'DIS' as statut, to_date('27/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      7    Select 'ID2' As id, 'DIS' as statut, to_date('23/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      8    Select 'ID2' As id, 'BLO' as statut, to_date('24/05/2015','DD/MM/YYYY') As dat_sta from dual union all
      9    Select 'ID2' As id, 'DIS' as statut, to_date('25/05/2015','DD/MM/YYYY') As dat_sta from dual union all
     10    Select 'ID2' As id, 'BLO' as statut, to_date('26/05/2015','DD/MM/YYYY') As dat_sta from dual union all
     11    Select 'ID2' As id, 'DLS' as statut, to_date('27/05/2015','DD/MM/YYYY') As dat_sta from dual
     12  )
     13  Select id,
     14         Max(statut) Keep (Dense_Rank Last Order By dat_sta) statut,
     15         Max(dat_sta) Keep (Dense_Rank Last Order By dat_sta) dat_sta
     16    From Data
     17   Where statut != 'DLS'
     18   Group By id
     19   Having Max(statut) Keep (Dense_Rank Last Order By dat_sta) = 'BLO'
     20  /
    ID  STATUT DAT_STA
    --- ------ -----------
    ID2 BLO    26/05/2015
     
    SQL>

  4. #4
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 34
    Par défaut
    Merci.

    çà marche bien sauf pour le cas de dates identiques. Et dans ce cas il faudrait, pour une même date, utiliser le champ Heure statut que j’avais pas mentionné au début.

    Exemple 3 :
    ID3 DIS 23/05/2015 05:09
    ID3 BLO 24/05/2015 08:21
    ID3 DIS 24/05/2015 12:31
    ID3 DLS 26/05/2015 23:59

    çà devrait me renvoyer rien du tout car pas bloqué (ID3 DIS 24/05/2015 12:31 > ID3 BLO 24/05/2015 08:21). Or le résultat renvoi bloqué (ID3 BLO 24/05/2015 08:21).

  5. #5
    Membre émérite Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Par défaut
    A partir de la requete de mnitu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select id,
          Max(statut) Keep (Dense_Rank Last Order By dat_sta, Heure ) statut,
          Max(dat_sta) Keep (Dense_Rank Last Order By dat_sta, Heure ) dat_sta
     From Data
    Where statut != 'DLS'
    Group By id
    Having Max(statut) Keep (Dense_Rank Last Order By dat_sta, Heure ) = 'BLO'

  6. #6
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 34
    Par défaut
    Super. Merci aux spécialistes.

  7. #7
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 34
    Par défaut
    Je sais pas si je dois ouvrir un autre post car maintenant çà concerne Crystal Report.
    La requête, je l'ai créée dans Oracle avec une vue que j'utilise dans mon état Crystal et je me demandais si il y avait possibilité de zapper la vue (car un peu longue) pour le faire direct dans Crystal et si quelqu’un avait une idée sur la formule.
    Merci

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

Discussions similaires

  1. Groupe d'options lié au selection de date
    Par saadoun dans le forum IHM
    Réponses: 2
    Dernier message: 28/02/2013, 09h47
  2. Pb selection de date
    Par edhos dans le forum Access
    Réponses: 3
    Dernier message: 25/10/2005, 13h37
  3. Select la date la plus récente
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2005, 16h45
  4. [SQL] selection des dates en ne distinguant pas l'heure
    Par meufeu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/06/2005, 11h29
  5. selection par date
    Par adgabd dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2004, 10h28

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