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 :

Comparer les dates de 2 lignes d'une même table


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Points : 23
    Points
    23
    Par défaut Comparer les dates de 2 lignes d'une même table
    Bonjour,
    j'ai une table TABLE avec les champs id1, id2, date, etat
    id1 est la clé
    Pour un même id2, j'ai plusieurs états possibles et à chaque état correspond une date
    Exemple :
    id1 id2 date etat
    1 10 08/10/2001 A
    2 10 08/10/2000 B
    3 20 08/10/2008 B

    Pour chaque id2, je dois récupérer id1 pour les 2 états A et B uniquement dans le cas où date (A) > date (B)

    Voici ma requête, le soucis, c'est qu'elle ne me renvoi aucun résultat :
    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
     
    SELECT t1.id1
    FROM TABLE t, ( 
     
    SELECT max( t.date ) AS date1, t.id1
    FROM TABLE t
    WHERE t.etat = 'A') t1, 
     
    ( SELECT max( t.date ) AS date2, t.id1
    FROM TABLE t
    WHERE t.etat = 'B') t2, 
     
    ( SELECT em.aff_id, t.id1
    FROM TABLE t
    WHERE em.etat = 'A') t3, 
     
    ( SELECT t.id2, t.id1
    FROM TABLE t
    WHERE t.etat = 'B') t4
     
    WHERE t1.id1 = t1.id1
    AND t1.id1 = t2.id1
    AND t1.id1 = t3.id1
    AND t1.id1 = t4.id1
    AND t3.id2 = t4.id2
    AND t1.date1 > t2.date2
    Je ne suis pas très calée en sql et encore moins en Oracle donc si vous aviez des idées, cela m'interesserait beaucoup.
    Peut être faudrait il écrire une procédure en PL/SQL, malheureusement, je n'y connais rien.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si j'ai bien compris votre besoin (mettre des exemples, c'est bien aussi), ceci devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    With MaTable AS
    (
    select 1 as id1, 10 as id2, date '2001-10-08' as coldate, 'A' as etat from dual union all
    select 2       , 10       , date '2000-10-08'           , 'B'         from dual union all
    select 3       , 20       , date '2008-10-08'           , 'B'         from dual
    )
      select id2,
             max(case etat when 'A' then id1 end) as id_A, 
             max(case etat when 'B' then id1 end) as id_B
        from MaTable
    group by id2
      having max(case etat when 'A' then coldate end) > max(case etat when 'B' then coldate end);

  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
    Et si il y a trois états
    Pour un même id2, j'ai plusieurs états possibles et à chaque état correspond une date
    il faut obtenir le id1 ou pas ?
    Exemple :
    id1 id2 date etat
    1 10 08/10/2001 A
    2 10 08/10/2000 B
    3 10 08/10/2000 C
    4 20 08/10/2008 B

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par devdebutante Voir le message
    Voici ma requête, le soucis, c'est qu'elle ne me renvoi aucun résultat :
    Votre requête ne peut rien vous renvoyer à part des erreurs de syntaxe (avec la fonction MAX notamment).

    J'ajoute une question à celle de mnitu: si l'id2 n'a qu'un état, doit-on le prendre?

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    merci pour vos réponses
    J'ai eu une piste aujourd'hui et j'ai finalement réussi à faire ce que je voulais
    Cela donne :

    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
     
    SELECT t1.id1
    FROM TABLE t, ( 
     
    SELECT t.date AS date1, t1.id1, t2.id1, t1.id2, t2.id2
    from
    ( select t.date, t.id1, t.id2 
         from TABLE t 
               where t.date in ( SELECT max(t.date) 
                                            from TABLE t 
                                                 where t.etat = 'A' )) t1, 
     
    ( select t.date, t.id1, t.id2
         from TABLE t 
               where t.date in ( SELECT max(t.date) 
                           from TABLE t 
                                where t.etat = 'B' )) t2, 
     
    WHERE t1.id1 = t2.id1
    AND t1.date1 > t2.date2
    Je peux remonter plusieurs résultats dont le max des dates pour chaque état.
    Ce qui me permet de les comparer.
    S'il n'y a qu'un état, je ne récupère pas l'id
    s'il y a 3 état, je récupère les id mais uniquement ceux avec les états A et B si date de A > à date de B

    J'espère que ça resservira à quelqu'un

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Brrr, quelle horreur...

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

Discussions similaires

  1. Comparer deux lignes d'une même table dans une bdd
    Par Pierrot33 dans le forum Général Java
    Réponses: 3
    Dernier message: 19/11/2011, 19h04
  2. Réponses: 3
    Dernier message: 14/06/2009, 00h14
  3. Réponses: 13
    Dernier message: 20/04/2007, 17h30
  4. Réponses: 8
    Dernier message: 19/04/2007, 19h41
  5. jointure sur des lignes d'une même table
    Par elsa_dach dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/01/2007, 12h08

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