Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2010, 11h44   #1
Invité régulier
 
Inscription : juin 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 86
Points : 5
Points : 5
Par défaut Avant dernier et dernier résultat dans 1 entrée

Bonjour, j'ai un petit soucis en SQL je ne sais pas comment ramener les deux premiers résultat d'une requète.

Soit la table RESERVATION composé de : RESERV_ID| DATE_RESERV | NBPERS

Lorsque j'interroge ma table j'ai deux résultat :

1 | 30/01/2011 | 3
2 | 28/01/2011 | 2

Je cherche la requête pour n'avoir qu'un seul résultat retourné et composé des deux entrées. Malheureusement avec le code suivant je retourne :
2 | 28/01/2011 | 2 | 2 | 28/01/2011 | 2

Code :
1
2
3
4
5
6
7
8
 
 
SELECT * FROM(
   SELECT * FROM RESERVATION WHERE rownum<=1 ORDER BY DATE_RESERV DESC) r1
   JOIN 
   (SELECT * FROM RESERVATION WHERE rownum<=1 ORDER BY DATE_RESERV ASC) r2
 
ON r1.RESERV_ID = r2.RESERV_ID)
Il peut y aussi y avoir plus de deux entrées dans cette table, à chaque fois il faut que je retourne la dernière et l'avant-dernière réservation.

Pouvez-vous m'aider SVP ? Merci d'avance !

ps : je sais c'est pas très beau comme code mais j'ai pas trouvé mieux, cela dit je reste ouvert aux propositions !
Goffer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 14h52   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Première erreur dans :
Code :
WHERE rownum<=1 ORDER BY DATE_RESERV DESC
rownum est évalué avant le ORDER BY, donc il faut toujours trier d'abord dans une sous requête avant de filtrer avec rownum.

Après quel est l'intérêt d'avoir les résultats sur 1 seule ligne ? c'est contre performant et il est préférable que ce soit le langage client (java,php,pl/sql....) qui pivote les lignes.

Si tu n'as vraiment pas le choix tu peux utiliser le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT 
  max(case when t2.rn = 1 then t2.RESERV_ID end) AS RESERV_ID_1,
  max(case when t2.rn = 1 then t2.DATE_RESERV end) AS DATE_RESERV_1,
  max(case when t2.rn = 1 then t2.NBPERS end) AS NBPERS_1,
  max(case when t2.rn = 2 then t2.RESERV_ID end) AS RESERV_ID_2,
  max(case when t2.rn = 2 then t2.DATE_RESERV end) AS DATE_RESERV_2,
  max(case when t2.rn = 2 then t2.NBPERS end) AS NBPERS_2
FROM 
  (SELECT t.*, row_number() over (ORDER BY date_reserv DESC) AS rn FROM t) t2
WHERE t2.rn <= 2
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 10h10   #3
Invité régulier
 
Inscription : juin 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 86
Points : 5
Points : 5
Bonjour Skuatamad et merci pour cette réponse, j'ai finalement réussi à résoudre mon problème.

En fait j'utilise Jasper iReport pour créer un document et j'avais besoin de la dernière / avant-dernière entrée pour faire mes réservations. Malheureusement comme je connais mal iReport, je ne savais pas comment afficher deux entrées, donc j'ai décidé de les concaténer !

Un peu bourrin comme solution mais quand on est pris par le temps...

Merci beaucoup de ton aide !
Goffer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h31.


 
 
 
 
Partenaires

Hébergement Web