Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1544 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1950909
hxcstyle
Posté le 16-12-2009 à 14:46:14  profilanswer
 

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.
 
 

mood
Publicité
Posté le 16-12-2009 à 14:46:14  profilanswer
 

n°1950916
flo850
moi je
Posté le 16-12-2009 à 15:14:57  profilanswer
 

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


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

n°1950928
hxcstyle
Posté le 16-12-2009 à 15:51:18  profilanswer
 

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

n°1950932
flo850
moi je
Posté le 16-12-2009 à 15:55:52  profilanswer
 

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


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

n°1950934
skeye
Posté le 16-12-2009 à 15:57:47  profilanswer
 

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 -
n°1950936
skeye
Posté le 16-12-2009 à 16:06:35  profilanswer
 

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 -
n°1950948
hxcstyle
Posté le 16-12-2009 à 16:48:06  profilanswer
 

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 (...) ?
 

n°1950954
fred777888​999
Posté le 16-12-2009 à 17:02:11  profilanswer
 

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+

n°1951169
Tibar
Posté le 17-12-2009 à 13:37:20  profilanswer
 

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,

n°1951174
hxcstyle
Posté le 17-12-2009 à 14:00:33  profilanswer
 

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 ^^

mood
Publicité
Posté le 17-12-2009 à 14:00:33  profilanswer
 

n°1951191
Tibar
Posté le 17-12-2009 à 14:30:23  profilanswer
 

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,

n°1951224
fred777888​999
Posté le 17-12-2009 à 15:16:02  profilanswer
 

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

n°1952027
hxcstyle
Posté le 21-12-2009 à 11:39:28  profilanswer
 

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 !

n°1952301
Tibar
Posté le 22-12-2009 à 10:30:50  profilanswer
 

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
n°1952706
MagicBuzz
Posté le 23-12-2009 à 10:57:49  profilanswer
 

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
 
;)

n°1953038
Tibar
Posté le 24-12-2009 à 13:30:48  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
div afficher/masquer sur image interactiveImpossible de mettre des liens sur une anim FLASH
Variable de Session prend Valeur du Get [Resolu][oracle] rechercher une valeur dans toute les tables?
visuel studio 2008/recuperer la valeur d'une cellule du gridview:hover impossible avec IE
afficher les combinaisons de chaine de caractèresAfficher un certain nombre de caractères dans une chaîne (S.O.S)
classer alphabiquement le contenu d'un répertoireReferencement : comment afficher ceci dans google?
Plus de sujets relatifs à : Impossible d'afficher une valeur pour un count égal à 0


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR