Impossible d'afficher une valeur pour un count égal à 0

Impossible d'afficher une valeur pour un count égal à 0 - SQL/NoSQL - Programmation

Marsh Posté le 16-12-2009 à 14:46:14    

Bonjour tout le monde,
 
Voici ma requête :
 
select langue,count (distinct(lower(email))) from client_member
where trunc(datejoin)=trunc(sysdate)-1
group by langue
order by langue;
 
Voici le résultat :
 
LANGUE COUNT(DISTINCT(LOWER(EMAIL)))
DEU            141228
ESP            575094
FRA            1369152
GBR            83569
ITA            353140
            2770
 
Le vide dans la colonne "LANGUE", c'est qu'il n' y a pas de valeur.
 
Seul hic quand le count retourne un résultat égale à null, cela fait qu'elle n'apparait pas dans les résultats. Jusque là c'est normal mais ! il faudrait que j'ai besoin de toutes les valeurs car j'ai un script qui récupère ces valeurs.  
Il faudrait que cela retourne une valeur du type "0" par exemple mais j'ai essayé les fonctions NVL ou DECODE pour ça et rien à faire je n'y arrive pas...
 
Si jamais quelqu'un a déja été confronté à ce type de problème et détenait la solution je suis tout ouie :-D
 
Merci d'avance à tous ceux qui se pencheront sur mon problème.
 
 

Reply

Marsh Posté le 16-12-2009 à 14:46:14   

Reply

Marsh Posté le 16-12-2009 à 15:14:57    

tu as une table ou sont stockées toutes les langues ?  
si oui , fait une jointure  
select langues.langue ,count (distinct(lower(email)))  
from langues LEFT JOIN client_member  ON client_member.langue = langues.langue
GROUP BY langues.langue


---------------

Reply

Marsh Posté le 16-12-2009 à 15:51:18    

Salut,
 
Ben le problème c'est que justement non ça aurait été trop beau sinon ^^
 
Merci quand même.
 

Reply

Marsh Posté le 16-12-2009 à 15:55:52    

donc tu cherches à afficher toutes les langues sans en avoir une liste ?


---------------

Reply

Marsh Posté le 16-12-2009 à 15:57:47    

euh, ta base de données est censée inventer des langues qui ne sont renseignées nulle part?[:pingouino]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-12-2009 à 16:06:35    

mal lu, je crois comprendre...:D
 
tu peux peut-être t'en sortir avec ce genre de conneries :  
 

Code :
  1. SELECT t1.langue, count(DISTINCT(lower(t2.email)))
  2. FROM client_member t1 LEFT OUTER JOIN client_member t2 ON (t1.id = t2.id)
  3. WHERE trunc(t2.datejoin)=trunc(sysdate)-1
  4. GROUP BY t1.langue
  5. ORDER BY t1.langue;


 
A tester, hein, je mets ça au pif. Sinon faut taper dans les requêtes imbriquées je pense...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-12-2009 à 16:48:06    

Salut skeye,
 
Merci pour ta réponse, mais ça ne marche toujours pas :-/
 
J'avais aussi essayé mais malheureusement soit j'avais le message "colonnes ambigues" soit j'avais toujours pas ligne en moins.
 
Qu'entends tu par requête imbriquée ?
 
tu veux dire avec des where in select (...) ?
 

Reply

Marsh Posté le 16-12-2009 à 17:02:11    

Pour compter avec un decode, tu peux adapter un truc du genre :
...
count (distinct(lower(email))) as compte_toutes_dates
count (distinct(decode(trunc(datejoin),trunc(sysdate)-1, '', lower(email)))) as compte_date_ok,
...
group by langue  
order by langue;  
Qui fera un full scan de ta table et retournera 1 (prendre en compte) pour le cas ou la date est Ok et 0 (ne pas prendre en compte dans le sum) dans le cas contraire. A tester.
A+

Reply

Marsh Posté le 17-12-2009 à 13:37:20    

Salut,
 
Après quelques tests, je peux te proposer ça :  
 
SELECT DRV2.Langue, SUM(DRV2.nb_occ)
FROM
(
SELECT CM.LANGUE,  
CASE  
     WHEN DRV.Langue IS NULL THEN 0  
     ELSE 1
END AS nb_occ
FROM CLIENT_MEMBER CM
LEFT OUTER JOIN  
(
 SELECT DISTINCT CM2.Langue
 FROM CLIENT_MEMBER CM2
)
DRV ON DRV.langue = CM.Langue AND trunc(CM.datejoin)=trunc(sysdate)-1
)
DRV2
GROUP BY DRV2.Langue
 
Bon courage,

Reply

Marsh Posté le 17-12-2009 à 14:00:33    

Salut fred777888999,
 
Malheureusement cela ne correspond pas à ce que j'attends car j'ai toujours une ligne en moins.
 
Mais merci quand même pour ton aide ^^

Reply

Marsh Posté le 17-12-2009 à 14:00:33   

Reply

Marsh Posté le 17-12-2009 à 14:30:23    

Salut,
 
Je ne sais pas si tu t'es trompé de destinataire dans ton message, mais j'ai trouvé un petit bug dans ma requête, en effet le champ vide n'est plus pris en compte...
Pour remédier à ça, je te propose de faire plutôt :  
 
SELECT DRV2.Langue, SUM(DRV2.nb_occ)
FROM
(
SELECT CM.LANGUE,  
CASE  
     WHEN DRV.Langue IS NULL THEN 0  
     ELSE 1
END AS nb_occ
FROM CLIENT_MEMBER CM
LEFT OUTER JOIN  
(
 SELECT DISTINCT NVL(CM2.Langue, 'VIDE') as langue
 FROM CLIENT_MEMBER CM2
)
DRV ON DRV.langue = NVL(CM.Langue, 'VIDE') AND trunc(CM.datejoin)=trunc(sysdate)-1
)
DRV2
GROUP BY DRV2.Langue
 
Bon courage,

Reply

Marsh Posté le 17-12-2009 à 15:16:02    

Il faut que tu enleve ta clause where avec le decode que je te propose. Gare quand meme aux perfs :(

Reply

Marsh Posté le 21-12-2009 à 11:39:28    

Bonjour,
 
Merci pour les réponses mais malheureusement je n'ai toujours pas de ligne qui apparait.
 
Pour ta solution Tibar, je n'ai pas le résultat, la requête est beaucoup trop lourde je pense.
 
Je vais essayer de trouver une issue en changeant mon script.
 
Merci à tous en tout cas et bonne continuation !

Reply

Marsh Posté le 22-12-2009 à 10:30:50    

Salut,
 
Pour les performances, j'ai testé sur une table à 3 colonnes champs et 10 champs enregistrements, créée pour les tests, mais en effet dès qu'on passe sur des grosses volumétrie, c'est beaucoup plus long...
Pour gagner du temps, tu pourrais par exemple créer une table temporaire qui contiendrait toutes les valeurs distinctes du champ Langue de ta table CLIENT_MEMBER, ça éviterait de la calculer à la volée :  
 
SELECT DISTINCT ISNULL(CM.Langue, 'Vide')
INTO #TMP_LANGUE
FROM CLIENT_MEMBER CL
sous SQL Server par exemple.  
 
Bon courage,
 


Message édité par Tibar le 24-12-2009 à 13:32:04
Reply

Marsh Posté le 23-12-2009 à 10:57:49    

Juste pour une question de sémentique :
 
une colonne dans une table, c'est un CHAMP
 
une ligne dans une table, c'est un ENREGISTREMENT
 
;)

Reply

Marsh Posté le 24-12-2009 à 13:30:48    

Merci :-)
 
Pourtant j'essaie de faire gaffe quand je poste...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed