PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 23/03/2020 21:41:33

preliator
Membre

Mobilités professionnelles (novice)

Bonjour,

Travaillant avec la mobilité professionnelle de l'Insee, je cherche à faire la somme d'un champ nommé Ipondi seulement sur les trajets commune de résidence à travail, et non pas travail à commune de résidence.

Admettons la colonne de commune de résidence nommée "Départ", et commune de travail nommée "Arrivée", et le champ que je souhaite faire la somme nommée "Ipondi", et admettons le cas suivant :

départ; arrivée; ipondi

La Ciotat; Marseille; 84
La Ciotat; Marseille; 15
Aubagne; Ceyreste; 12
Marseille; La Ciotat; 73

En effectuant la formule suivante ...

select départ, arrivée, sum(ipondi)
from trajets
group by départ, arrivée

J'obtiens donc le résultat suivant :

La Ciotat; Marseille; 99
Aubagne; Ceyreste; 12
Marseille; La Ciotat; 73

Ce qui est normal. Je voudrais cependant "supprimer" la ligne Marseille; La Ciotat car c'est le trajet retour des deux premières lignes.
Ceci étant pour arriver à ce résultat :

départ; arrivée; ipondi

La Ciotat; Marseille; 99
Aubagne; Ceyreste; 12

Comment faire cela sur PostgreSQL ?

Merci.

Hors ligne

#2 24/03/2020 07:55:51

rjuju
Administrateur

Re : Mobilités professionnelles (novice)

Comment distinguez-vous l'aller du retour ?

Hors ligne

#3 24/03/2020 10:13:09

preliator
Membre

Re : Mobilités professionnelles (novice)

Bonjour et merci de votre réponse.

Disons que je prendrais la ligne qui possède la valeur d'Ipondi la plus élevée pour la valeur d'aller.


Ainsi, entre ces deux lignes :

La Ciotat; Marseille; 99
Marseille; La Ciotat; 73

Je garde La Ciotat; La Marseille; 99.

Dernière modification par preliator (24/03/2020 10:14:07)

Hors ligne

#4 24/03/2020 10:48:54

rjuju
Administrateur

Re : Mobilités professionnelles (novice)

J'imagine quelque chsoe comme ça :

=# select * from ipondi ;
  depart   |  arrivee  | ipondi
-----------+-----------+--------
 la ciotat | marseille |     15
 la ciotat | marseille |     84
 aubagne   | ceyreste  |     12
 marseille | la ciotat |     73
(4 rows)

=# with rang as (select depart, arrivee, sum(ipondi) as sum from ipondi group by 1, 2),
retour as (
    select a.depart, a.arrivee, a.sum
    from rang a
    join rang b on a.depart = b.arrivee and a.arrivee = b.depart and a.sum <= b.sum
)
select * from rang except (select * from retour) ;
  depart   |  arrivee  | sum
-----------+-----------+-----
 la ciotat | marseille |  99
 aubagne   | ceyreste  |  12
(2 rows)

Hors ligne

#5 24/03/2020 11:20:51

preliator
Membre

Re : Mobilités professionnelles (novice)

Je vous dis un énorme merci. En somme, vous m'avez montré une syntaxe que je ne connaissais pas, je vais pouvoir progresser.
Cordialement.

Hors ligne

Pied de page des forums