Impossible d'afficher une valeur pour un count égal à 0 - SQL/NoSQL - Programmation
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
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.
Marsh Posté le 16-12-2009 à 15:55:52
donc tu cherches à afficher toutes les langues sans en avoir une liste ?
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?
Marsh Posté le 16-12-2009 à 16:06:35
mal lu, je crois comprendre...
tu peux peut-être t'en sortir avec ce genre de conneries :
Code :
|
A tester, hein, je mets ça au pif. Sinon faut taper dans les requêtes imbriquées je pense...
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 (...) ?
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+
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,
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 ^^
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,
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
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 !
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,
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
Marsh Posté le 24-12-2009 à 13:30:48
Merci :-)
Pourtant j'essaie de faire gaffe quand je poste...
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.