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 23/11/2010, 11h16   #1
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Par défaut aide sur écriture d'une requète

Bonjour,
J'ai besoin d'écrire la requete suivante (peut être n'est ce pas possible) sur la table suivante:
Code :
1
2
3
4
DESC awy_sect
airway_name     NOT NULL varchar2(7)
order_num       NOT NULL number(38)
point_name      NOT NULL varchar2(5)
soit les instance suivantes :
Code :
1
2
3
4
5
6
7
AWY1    1    PT1
AWY1    2    PT2
AWY1    3    PT3
AWY2    1    PTA
AWY2    2    PTB
AWY2    3    PTC
AWY2    4    PTD
Je voudrais que ma requete SQL me renvoie une liste de couples de point_name (point courant + point suivant) ordonnée par airway_name et order_num, soit:
Code :
1
2
3
4
5
AWY1 PT1 PT2
AWY1 PT2 PT3
AWY2 PTA PTB
AWY2 PTB PTC
AWY3 PTC PTD
Si quelqu'un a une piste ?
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h32   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 470
Points : 10 470
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec la fonction LEAD :
Code :
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
WITH awy_sect AS
(
SELECT 'AWY1' AS airway_name, 1 AS order_num, 'PT1' AS point_name FROM dual union ALL
SELECT 'AWY1'               , 2             , 'PT2'               FROM dual union ALL
SELECT 'AWY1'               , 3             , 'PT3'               FROM dual union ALL
SELECT 'AWY2'               , 1             , 'PTA'               FROM dual union ALL
SELECT 'AWY2'               , 2             , 'PTB'               FROM dual union ALL
SELECT 'AWY2'               , 3             , 'PTC'               FROM dual union ALL
SELECT 'AWY2'               , 4             , 'PTD'               FROM dual
)
  ,  sr AS
(
SELECT airway_name, point_name AS point_courant,
       lead(point_name) over(partition BY airway_name ORDER BY order_num ASC) AS point_suivant
  FROM awy_sect 
)
SELECT airway_name, point_courant, point_suivant
  FROM sr
 WHERE point_suivant IS NOT NULL;
 
AIRWAY_NAME POINT_COURANT POINT_SUIVANT
----------- ------------- -------------
AWY1        PT1           PT2
AWY1        PT2           PT3
AWY2        PTA           PTB
AWY2        PTB           PTC
AWY2        PTC           PTD
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h38   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 307
Points : 5 796
Points : 5 796
Dans ce cas simple une jointure pourrait faire l'affaire
Code :
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
30
31
32
 
Connected TO Oracle DATABASE 10g Express Edition Release 10.2.0.1.0 
Connected AS mni
 
SQL> 
SQL> WITH awy_sect AS
  2  (
  3  SELECT 'AWY1' AS airway_name, 1 AS order_num, 'PT1' AS point_name FROM dual union ALL
  4  SELECT 'AWY1'               , 2             , 'PT2'               FROM dual union ALL
  5  SELECT 'AWY1'               , 3             , 'PT3'               FROM dual union ALL
  6  SELECT 'AWY2'               , 1             , 'PTA'               FROM dual union ALL
  7  SELECT 'AWY2'               , 2             , 'PTB'               FROM dual union ALL
  8  SELECT 'AWY2'               , 3             , 'PTC'               FROM dual union ALL
  9  SELECT 'AWY2'               , 4             , 'PTD'               FROM dual
 10  )
 11  SELECT a.airway_name, a.point_name start_point, b.point_name end_point
 12    FROM awy_sect a
 13         JOIN
 14         awy_sect b
 15      ON a.airway_name = b.airway_name
 16         AND a.order_num = b.order_num - 1
 17  /
 
AIRWAY_NAME START_POINT END_POINT
----------- ----------- ---------
AWY1        PT1         PT2
AWY1        PT2         PT3
AWY2        PTA         PTB
AWY2        PTB         PTC
AWY2        PTC         PTD
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 14h28   #4
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Merci de votre rapidité.
Je retiens particulièrement la solution de 'waldar' car elle ne dépends pas des valeurs de ORDER_NUM mais de leur ordre, c'est ce que je voulais en fait.
Merci encore
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h06.


 
 
 
 
Partenaires

Hébergement Web