Message posté par : Nicolas Ribot
----------------------------------------
Bonsoir,
Marrant...
Une façon super alambiquée il me semble, mais je vois pas (encore) plus direct:
-----------------
Code :
create table trajet (
id serial primary key ,
depart text,
arrivee text,
ipondi int
);
insert into trajet (depart, arrivee, ipondi) values
('La Ciotat', 'Marseille', 84),
('Aubagne', 'Ceyreste', 12),
('Marseille', 'La Ciotat', 73),
('Istres', 'Grandbois', 23),
('Istres', 'Marseille', 3),
('Marseille', 'Toulon', 11),
('Marseille', 'Istres', 13);
-- Trouver les trajets qui ont des allers-retours:
select t.*, row_number() over () as newid
from trajet t
where exists(
select null
from trajet t2
where t.depart = t2.arrivee and t.arrivee = t2.depart
);
-- newid permet de numéroter les lignes, et donc d'avoir des paires de trajets
aller/retour: les id impairs peuvent etre vus comme les id des trajets dans un sens, les
id pairs les trajets dans l'autre sens:
id depart arrivee ipondi newid
1 La Ciotat Marseille 84 1
3 Marseille La Ciotat 73 2
5 Istres Marseille 3 3
7 Marseille Istres 13 4
-- ensuite on peut choisir parmi les trajets ceux qui ne sont pas dans cette liste pour
les trajets retour (considérons ici que les trajets retour ont des id pairs)
with tmp as (
select t.*, row_number() over () as newid
from trajet t
where exists(
select null
from trajet t2
where t.depart = t2.arrivee and t.arrivee = t2.depart
)
)
select t.*, sum(t.ipondi) over ()
from trajet t
where not exists(
select null
from tmp
where tmp.newid % 2 = 0 and t.id = tmp.id
);
-- windows function inutile ici, mais elle permet de voir la somme des ipondi tout en
voyant les trajets individuels, pour contrôle:
id depart arrivee ipondi sum
1 La Ciotat Marseille 84 133
2 Aubagne Ceyreste 12 133
4 Istres Grandbois 23 133
5 Istres Marseille 3 133
6 Marseille Toulon 11 133
-- Une somme simple sur ipondi suffit donc:
with tmp as (
select t.*, row_number() over () as newid
from trajet t
where exists(
select null
from trajet t2
where t.depart = t2.arrivee and t.arrivee = t2.depart
)
)
select sum(t.ipondi) as sum_ipondi
from trajet t
where not exists(
select null
from tmp
where tmp.newid % 2 = 0 and t.id = tmp.id
);
sum_ipondi
133
-----------------
Cherchons plus simple... ;)
Nicolas
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=331371#p331371
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net