Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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/2011, 18h59   #1
Membre éprouvé
 
Inscription : juillet 2004
Messages : 437
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 437
Points : 451
Points : 451
Par défaut Moyenne conditionnée fonction AVG ?

Bonjour à tous,

Je souhaiterais faire une moyenne sur deux colonnes d'une table en supprimant les valeurs égales à 0.

Voici ce que je souhaite faire :

Table toto (id, date, montant1, montant2) ; id et date représentant la clef de l'enregistrement

supposons les lignes suivantes

1,34,0,17
1,34,9,28
1,35,10,10
1,35,10,0


je voudrais avoir le résultat suivant

1,34,9, avg(17,28)
1,35, avg(10,10), 10


j'ai tenté le select avec la fonction AVG.

Mais les valeurs à 0 sont dans la moyenne, dès lors je n'ai pas le résultat que je souhaite avoir.
par example, pour l'enregistrement 1(;35), la moyenne du montant2 est renvoyé à 5 (10+0/2 car deux enregistrements dans la table). Or je souhaite que la valeur renvoyée soit 10 car je ne veux pas que la valeur 0 soit comptabilisée dans la moyenne.

Merci de votre aide.

cdlt
ZERS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 19h06   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Code :
1
2
3
4
select id, date, avg(montant2)
from toto
where montant2 != 0
group by id, date
ou plus tordu :

Code :
1
2
3
SELECT id, date, avg(case when montant2 = 0 then nulll else montant2 end)
FROM toto
GROUP BY id, date
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 19h56   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pour éviter le case un peu long :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH toto AS
(
SELECT 1 AS id, 34 AS dt,  0 AS mt1, 17 AS mt2 FROM dual union ALL
SELECT 1      , 34      ,  9       , 28        FROM dual union ALL
SELECT 1      , 35      , 10       , 10        FROM dual union ALL
SELECT 1      , 35      , 10       ,  0        FROM dual
)
  SELECT id, dt
       , avg(nullif(mt1, 0)) AS mt1_avg
       , avg(nullif(mt2, 0)) AS mt2_avg
    FROM toto
GROUP BY id, dt
ORDER BY id, dt;
 
        ID         DT    MT1_AVG    MT2_AVG
---------- ---------- ---------- ----------
         1         34          9       22.5
         1         35         10         10
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 20h05   #4
Rédacteur
 
Inscription : décembre 2002
Messages : 2 388
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 388
Points : 3 275
Points : 3 275
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
ou plus tordu :
Moi j'ai pensé tout de suite à la solution tordue (avec un bon vieux DECODE), mais je me suis abstenu car votre solution initiale peut profiter d'un index éventuel.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 09h14   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

Sauf que la solution pas tordue ne marche pas : comme il y a deux colonnes qui doivent être calculées, si l'une vaut 0, toute la ligne est éliminée alors que l'autre est éventuellement non nulle (et pas NULLe )

Waldar, c'est lent le case ?
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 10h38   #6
Membre éprouvé
 
Inscription : juillet 2004
Messages : 437
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 437
Points : 451
Points : 451
Bonjour à tous,

merci pour vos réponses.

Je vais tester la solution de waldar tout de suite car j'avais déjà programmé les autres mais elles ne donnaient pas du tout ce que je souhaite puique deux colonnes sont à tester et pas une.

Cordialement

Edit : testé et validé !

Merci !
ZERS 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 14h47.


 
 
 
 
Partenaires

Hébergement Web