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 :

Combiner deux résultats de requete


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Combiner deux résultats de requete
    Bonjour,

    Je suis face à un petit problème de SQL que je n'arrive pas à résoudre.
    J'ai deux requêtes (elles s'effectuent sur la même table) qui renvoient certains résultats, et j'aimerais combiner les résultats des deux requêtes.

    Les deux premières requêtes renvoient les résultats suivants :

    Résultat Requête n°1 :

    1 01/05/2010 ---
    2 01/04/2010 01/01/2012
    7 01/01/2010 ---
    Résultat Requête n°2 :

    3 01/01/2005 31/10/2007
    5 01/01/1996 31/12/2006
    6 08/09/1999 31/12/2005
    4 01/01/2000 31/12/2004
    Concrètement, la première requête fait un tri DESC sur la première colonne, et la seconde fait un tri DESC sur la seconde colonne

    J'aimerais donc pouvoir combiner les résultats de la manière suivante :

    1 01/05/2010 ---
    2 01/04/2010 01/01/2012
    7 01/01/2010 ---
    3 01/01/2005 31/10/2007
    5 01/01/1996 31/12/2006
    6 08/09/1999 31/12/2005
    4 01/01/2000 31/12/2004
    C'est-à-dire, en mettant très simplement les résultats de la seconde requête directement derrière ceux de la première.

    Quelqu'un aurait une idée, par hasard ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ce serait mieux de nous donner ta requête !

    Avec les données que tu proposes, il devrait être suffisant de faire la clause ORDER BY sur les deux colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY date1 DESC, date2 DESC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Voici les deux requêtes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from table1
    where (table1_datefin > sysdate or table1_datefin is null)
    order by table1_datedebut desc
     
    select * from table1
    where table1_datefin < sysdate
    order by table1_datefin desc
    Juste pour info : j'ai essayé de faire le rassemblement avec un UNION ALL, mais visiblement, cela ne fonctionne pas

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Tes deux requêtes excluent le cas où datefin = sysdate. Normal ?

    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT * 
    FROM ( 
      SELECT * 
      FROM table1
      WHERE table1_datefin > sysdate 
        OR table1_datefin IS NULL
     
      UNION
     
      SELECT * 
      FROM table1
      WHERE table1_datefin < sysdate
    ) AS Tmp
    ORDER BY table1_datedebut DESC, table1_datefin DESC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Pour ce qui est du cas où datefin = sysdate, oui, en effet, le cas n'était pas géré, il faudra que je le rajoute.

    Après, j'ai testé ta requête, mais il me renvoie l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00933 : la commande SQL ne se termine pas correctement
    (il me met en surbrillance le "AS")

    (j'avais oublié de préciser que j'étais en contexte Oracle, mais je ne sais pas si cela change grand-chose)

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je ne maîtrise pas Oracle mais je crois savoir que les alias de tables se donnent sans le mot clé AS chez ce SGBD parfois bizarre !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT * 
    FROM ( 
      SELECT * 
      FROM table1
      WHERE table1_datefin > sysdate 
        OR table1_datefin IS NULL
     
      UNION
     
      SELECT * 
      FROM table1
      WHERE table1_datefin < sysdate
    ) Tmp
    ORDER BY table1_datedebut DESC, table1_datefin DESC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    J'ai enlevé l'alias pour le FROM et la requête fonctionne.

    Le hic, c'est que l'association des deux tris à la fin de la requête finale ne donne pas le résultat souhaité (c'était déjà ce que j'avais testé au début) :

    Au lieu d'avoir ceci (je mets les deux tris en couleurs différentes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1 01/05/2010 ---
    2 01/04/2010 01/01/2012
    7 01/01/2010 ---
    3 01/01/2005 31/10/2007
    5 01/01/1996 31/12/2006
    6 08/09/1999 31/12/2005
    4 01/01/2000 31/12/2004
    je me retrouve avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1 01/05/2010 ---
    2 01/04/2010 01/01/2012
    7 01/01/2010 ---
    3 01/01/2005 31/10/2007
    4 01/01/2000 31/12/2004 
    6 08/09/1999 31/12/2005
    5 01/01/1996 31/12/2006

  8. #8
    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
    Quelle est la règle de regroupement ?
    D'abord, les résultats de la requete 1 puis ceux de la requete 2 ?

    Si c'est le cas, rajoute une colonne tri qui prend 1 pour la première et 2 pour la seconde.
    Ensuite dans le ORDER BY tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY tri, decode(tri, 1, date1, date 2) desc
    Je vais tester, je suis pas sur du 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
    19
    20
    WITH t AS 
    (	SELECT 1 tri, TO_DATE('01/05/2010', 'DD/MM/RRRR') d1, NULL d2 FROM dual
    UNION ALL SELECT 1 tri, TO_DATE('01/04/2010', 'DD/MM/RRRR') d1, TO_DATE('01/01/2012', 'DD/MM/RRRR') d2 FROM dual
    UNION ALL SELECT 1 tri, TO_DATE('01/01/2010', 'DD/MM/RRRR') d1, NULL d2 FROM dual
    UNION ALL SELECT 2 tri, TO_DATE('01/01/2005', 'DD/MM/RRRR') d1, TO_DATE('31/12/2007', 'DD/MM/RRRR') d2 FROM dual
    UNION ALL SELECT 2 tri, TO_DATE('01/01/2000', 'DD/MM/RRRR') d1, TO_DATE('31/12/2004', 'DD/MM/RRRR') d2 FROM dual
    UNION ALL SELECT 2 tri, TO_DATE('01/01/1996', 'DD/MM/RRRR') d1, TO_DATE('31/12/2006', 'DD/MM/RRRR') d2 FROM dual
    UNION ALL SELECT 2 tri, TO_DATE('08/09/1999', 'DD/MM/RRRR') d1, TO_DATE('31/12/2005', 'DD/MM/RRRR') d2 FROM dual
    )
    SELECT * FROM t
    ORDER BY tri, DECODE(tri, 1, d1, 2,d2) desc
     
    TRI	D1	D2
    1	01/05/2010	
    1	01/04/2010	01/01/2012
    1	01/01/2010	
    2	01/01/2005	31/12/2007
    2	01/01/1996	31/12/2006
    2	08/09/1999	31/12/2005
    2	01/01/2000	31/12/2004
    C'est bon !

  9. #9
    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
    En gros c'est la même solution que celle proposée par McM
    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
     
    SQL> with table1 as (
      2    Select 1 id, to_date('01/05/2010','DD/MM/YYYY') date_deb, Null date_fin from dual union all
      3    Select 2,  to_date('01/04/2010','DD/MM/YYYY'), to_date('01/01/2012','DD/MM/YYYY') from dual union all
      4    Select 7,  to_date('01/01/2010','DD/MM/YYYY'), Null from dual union all
      5    Select 3,  to_date('01/01/2005','DD/MM/YYYY'), to_date('31/10/2007','DD/MM/YYYY') from dual union all
      6    Select 5,  to_date('01/01/1996','DD/MM/YYYY'), to_date('31/12/2006','DD/MM/YYYY') from dual union all
      7    Select 6,  to_date('08/09/1999','DD/MM/YYYY'), to_date('31/12/2005','DD/MM/YYYY') from dual union all
      8    Select 4,  to_date('01/01/2000','DD/MM/YYYY'), to_date('31/12/2004','DD/MM/YYYY') from dual
      9  )
     10  select *
     11    from table1
     12   Order by Case
     13              When date_fin > sysdate Or date_fin Is Null Then date_deb
     14              Else date_fin
     15            end desc
     16  /
     
            ID DATE_DEB    DATE_FIN
    ---------- ----------- -----------
             1 01/05/2010  
             2 01/04/2010  01/01/2012
             7 01/01/2010  
             3 01/01/2005  31/10/2007
             5 01/01/1996  31/12/2006
             6 08/09/1999  31/12/2005
             4 01/01/2000  31/12/2004
     
    7 rows selected

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Impeccable !
    Ces deux dernières solutions sont parfaites !
    Merci à tous !

  11. #11
    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
    J'avais pas vu les restrictions du départ, je croyais que c'étaient 2 select sur 2 tables différentes.
    La solution de Mnitu est meilleure car tu ne fais plus qu'un seul accès à ta table.

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

Discussions similaires

  1. [MySQL] combiner deux requetes pour affichage d'un menu automatique
    Par ledisciple dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2012, 17h14
  2. Jointure entre deux résultats de 2 requetes
    Par fullmetalalchemiste dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/05/2012, 19h08
  3. Réponses: 3
    Dernier message: 20/01/2009, 11h34
  4. 2 requetes pour combiner les résultats
    Par creale10 dans le forum Requêtes
    Réponses: 9
    Dernier message: 12/12/2006, 00h10
  5. résultat de requete dans un formulaire
    Par tomo0013 dans le forum Access
    Réponses: 3
    Dernier message: 17/09/2005, 14h53

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