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 :

Requête de sélection : casse tête


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Points : 50
    Points
    50
    Par défaut Requête de sélection : casse tête
    Bonjour,

    j'ai une table arrangée de la manière suivante

    idligne1 ; indexa ; date1 ; a ; b
    idligne2 ; indexb ....
    idligne3 ; indexc ....
    idligne4 ; indexa ; date2 ; b ; c
    idligne5 ; indexb ....
    idligne6 ; indexa ; date3 ; c ; d

    Je souhaite avoir une requête qui me retourne

    indexa ; date1 ; date 2 ; b ; c
    indexa ; date2 ; date 3 ; c ; d
    indexb ....
    indexc ....

    Quelqu'un a une idée ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quelle est la règle de gestion concernant les valeurs a,b,c,d ?
    Vous ne souhaitez que celles qui correspondent à date2 ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Points : 50
    Points
    50
    Par défaut
    Non,

    a, b, c, d sont des états et (a) est toujours null.

    Ce que je souhaite obtenir donc est :

    j'entre dans état b à date1 et quitte celui-ci à date2 pour aller vers état c
    j'entre dans état c à date2 et quitte celui-ci à date3 pour aller vers état d

    et ainsi de suite

    Voilà, j'espère que c'est plus clair.

    Merci

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Voici un exemple et une requête.
    J'ai mis une jointure externe ne sachant pas toutes les restrictions.
    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 'indexa' ind, TRUNC(SYSDATE, 'RRRR') AS ladate, '' etat_avant, 'b' etat_apres FROM dual
    UNION SELECT 'indexb', TRUNC(SYSDATE, 'RRRR')+1 AS ladate, '' etat_avant, 'b' etat_apres FROM dual
    UNION SELECT 'indexc', TRUNC(SYSDATE, 'RRRR')+2 AS ladate, '' etat_avant, 'b' etat_apres FROM dual
    UNION SELECT 'indexa', TRUNC(SYSDATE, 'RRRR')+3 AS ladate, 'b' etat_avant, 'c' etat_apres FROM dual
    UNION SELECT 'indexa', TRUNC(SYSDATE, 'RRRR')+4 AS ladate, 'c' etat_avant, 'd' etat_apres FROM dual
    	)
     SELECT t1.ind, t1.ladate date1, t2.ladate date2, t1.etat_apres AS etat1, t2.etat_apres etat2
     FROM t t1, t t2
     WHERE t1.ind = t2.ind (+)
     AND t1.etat_apres = t2.etat_avant (+)
     
    IND	DATE1	DATE2	ETAT1	ETAT2
    indexa	01/01/2010	04/01/2010	b	c
    indexa	04/01/2010	05/01/2010	c	d
    indexa	05/01/2010		d	
    indexb	02/01/2010		b	
    indexc	03/01/2010		b
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec LEAD on doit pouvoir économiser la jointure :
    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
    WITH t as
    (
    select 'indexa' as c1, trunc(sysdate) as c2, '' as c3, 'b' as c4 from dual union all
    select 'indexb'      , trunc(sysdate) + 1  , ''      , 'b'       from dual union all 
    select 'indexc'      , trunc(sysdate) + 2  , ''      , 'b'       from dual union all
    select 'indexa'      , trunc(sysdate) + 3  , 'b'     , 'c'       from dual union all
    select 'indexa'      , trunc(sysdate) + 4  , 'c'     , 'd'       from dual
    )
      select c1, c2,
             lead(c2) over(partition by c1 order by c2 asc) as c2_next,
             c4,
             lead(c4) over(partition by c1 order by c2 asc) as c4_next
        from t
    order by c1 asc, c2 asc;
     
    C1	C2		C2_NEXT		C4	C4_NEXT
    indexa	01/02/2010	04/02/2010	b	c
    indexa	04/02/2010	05/02/2010	c	d
    indexa	05/02/2010			d	
    indexb	02/02/2010			b	
    indexc	03/02/2010			b

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Points : 50
    Points
    50
    Par défaut
    Merci , c'est tout bon.

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

Discussions similaires

  1. Requête de sélection : casse tête 2
    Par sfoggy dans le forum SQL
    Réponses: 15
    Dernier message: 05/02/2010, 10h53
  2. Requête SQL casse-tête
    Par MikeV dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/06/2007, 14h09
  3. Requête (casse tête)
    Par shadeoner dans le forum SQL
    Réponses: 13
    Dernier message: 12/06/2007, 17h13
  4. Requête casse tête!
    Par sonorc dans le forum Langage SQL
    Réponses: 10
    Dernier message: 08/05/2007, 02h03
  5. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03

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