#1 Mon 21 March 2016 14:46
- FloG38
- Participant occasionnel
- Date d'inscription: 5 Mar 2014
- Messages: 15
[PostGreSQL] problème de calcul de part cumulée
Bonjour à tous
Tout d'abord je précise que je travail sur Windows XP avec la version suivante :
"PostgreSQL 8.4.19, compiled by Visual C++ build 1400, 32-bit"
Je souhaite calculer la part cumulée des clients pour une table de ce type :
nom; client
"pierre";50
"paul";10
"jack";15
"jose";20
"marie";40
"josette";20
Je fais donc la requête suivante, qui d'après mes recherches semble correcte:
SELECT a1.nom, a1.client, SUM (a1.client) as tot_client,SUM(a2.client)::numeric / (SELECT SUM(client)::numeric FROM ex ) part_cumul
FROM ex a1, ex a2
WHERE a1.client <= a2.client OR (a1.client = a2.client AND a1.nom = a2.nom)
GROUP BY a1.nom, a1.client
ORDER BY a1.client DESC, a1.nom DESC ;
J'ai le résultat suivant :
nom;client;part_cumul
"pierre";50;0.32258064516129032258
"marie";40;0.58064516129032258065
"josette";20;0.83870967741935483871
"jose";20;0.83870967741935483871
"jack";15;0.93548387096774193548
"paul";10;1.00000000000000000000
Il associe systématiquement les lignes de même valeur (en gras). Je ne comprends pas pourquoi et j'aimerais avoir la valeur cumulée intermédiaire.
Est-ce que cela provient de ma version de PostGreSQL ? qui est assez ancienne il faut le dire.
Y a-t-il un réglage à faire ?
Est-ce que je fais une erreur dans ma requête ?
Je suis dans une impasse et je ne sais plus où chercher pour trouver une solution, c'est pourquoi je sollicite votre aide sur ce coup.
Merci par avance pour vos réactions et n'hésitez pas à me dire si je ne suis pas assez clair.
Hors ligne
#2 Mon 21 March 2016 15:39
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [PostGreSQL] problème de calcul de part cumulée
Bonjour,
WHERE a1.client <= a2.client OR (a1.client = a2.client AND a1.nom = a2.nom)
Normal que les lignes en gras soient associées. La première proposition est vraie a1.client=a2.client
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Mon 21 March 2016 16:28
Re: [PostGreSQL] problème de calcul de part cumulée
Bonjour,
Normalement avec la 8.4 tu peux utiliser des fonctions Window.
du coup, tu pourrais faire quelques choses comme cela
select nom,
client,
sum(client) over (order by client desc) / sum(client) over ()
from a
Je n'ai pas testé mais l'idée et là.
le sum(client) over () : calcul la somme de tout tes clients
le sum(client) over (order by client desc) : te fait la somme cumul dans l'ordre du nombre de client descendant.
Hors ligne
#4 Mon 21 March 2016 16:35
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [PostGreSQL] problème de calcul de part cumulée
Bonjour,
@cbredel, oui bien sûr et avant tout cela l'utilisation d'une close WITH permettrait déjà d’éclaircir la situation.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#6 Mon 21 March 2016 17:33
- FloG38
- Participant occasionnel
- Date d'inscription: 5 Mar 2014
- Messages: 15
Re: [PostGreSQL] problème de calcul de part cumulée
Merci pour vos réponses.
En effet la requête ne permet pas de différencier ces valeurs. Je vais ainsi chercher à mettre d'autres critères pour les différencier
Hors ligne
#7 Mon 21 March 2016 21:11
Re: [PostGreSQL] problème de calcul de part cumulée
Mais si, tu peux le faire...
Ce que je t'ai transmis c'est un exemple... envoyer comme cela...
Effectivement, pour être complètement précis, il faut simplement ordonné sur le nom et le champ client pour différentier les noms dont la valeur de client est identique.
Ce sera donc qq chose du type :
select nom,client,
sum(client) over (order by client desc,nom),
sum(client) over ()
from a
order by client desc
Hors ligne
#8 Tue 22 March 2016 11:28
- FloG38
- Participant occasionnel
- Date d'inscription: 5 Mar 2014
- Messages: 15
Re: [PostGreSQL] problème de calcul de part cumulée
Oui merci c'est vrai que l'on peut faire comme ça mais du coup je vais utiliser d'autres critères qui m'apporteront plus pour mon analyse.
Hors ligne