Bonjour,
J'ai une requete avec un count(*) avec des clauses where.
Est ce que l'on peut retourner 0 quand il n'y a pas de valeur retourné (no rows returned)
Merci.
Oracle 10g.
Version imprimable
Bonjour,
J'ai une requete avec un count(*) avec des clauses where.
Est ce que l'on peut retourner 0 quand il n'y a pas de valeur retourné (no rows returned)
Merci.
Oracle 10g.
Utilisez la pseudo table DUAL avec un COALESCE ou un decode.
A +
A priori, Count retounre toujours une valeur non ?
Tout à fait d'accord et si l'on ne suppose que grizzz s'est trompé et qu'il ne s'agit pas d'un COUNT(*) mais plutôt d'une sélection de colonnes "quelconques" :wink: alors il faut capturer l'exception dans un bloc :Citation:
Envoyé par Tofalu
Code:
1
2
3
4
5
6 BEGIN SELECT ...; -- génère une exception NO_DATA_FOUND EXCEPTION WHEN NO_DATA_FOUND THEN -- traitement END;
sur que le count(*) retourne toujours une valeurs mais si je donne pas tous les détails ;)
c'est bien un select avec un count(*) mais il y a d'autres colonnes dans le select et un group by.
J'avais regardé déjà COALESCE mais je n'ai pas abouti.Code:SELECT to_char(date_depart,'WW') AS SEMAINE,PAYS, COUNT (*) as DISPO FROM... WHERE... GROUP BY PAYS,to_char(date_depart,'WW') ORDER by SEMAINE
bah si la clause WHERE ne permet pas de sélectionner une semaine et un pays qu'est ce que tu veux qu'il affiche quand le compte est à 0 ?
Quand cela fonctionne :
SEMAINE PAYS DISPO
45 MAR 12
Quand il n'y a pas de résultat j'ai un now rows returned et je voudrai cela a la place
SEMAINE PAYS DISPO
44 MAR 0
Merci.
Excuse moi mais comment veux-tu que la requête puisse deviner la semaine et le pays ?
A moins d'utiliser une jointure ouverte, il n'y a pas de solution autre que de retraiter applicativement.
Mais pour te conseiller sur la jointure ouverte il faudrait ton code complet.
Dommage, la solution se trouvait au milieu de tes petits points.... (par les jointures externes...) :roll:Citation:
Envoyé par grizzz
Je pense qu'il y a tout.Code:
1
2
3
4
5
6
7
8 SELECT to_char(date_depart,'WW') AS SEMAINE,PAYS, COUNT (*) as DISPO FROM VUE,REF_PAYS,REF_VILLE WHERE UPPER(REF_PAYS.PAYS) in ('MAR') and to_char(date_depart,'WW') in (44,45,46,47,48,49,50,51,52) AND VUE.ID_VILLE_DEPART = REF_VILLE.VIL_ID AND vue.ID_DESTINATION = REF_PAYS.PAY_ID AND REF_VILLE.VILLE = 'BDX' GROUP BY PAYS,to_char(date_depart,'WW') ORDER by SEMAINE
Je n'ai aucun resultat pour la semaine 44 je voudrai un 0
Ca doit donner ce qu'il faut. A vérifier quand même...
Code:
1
2
3
4
5
6
7 SELECT to_char(date_depart,'WW') AS SEMAINE,PAYS, COUNT (*) AS DISPO FROM VUE,REF_PAYS,REF_VILLE WHERE UPPER(REF_PAYS.PAYS) IN ('MAR') AND to_char(date_depart,'WW') IN (44,45,46,47,48,49,50,51,52) AND REF_VILLE.VIL_ID = VUE.ID_VILLE_DEPART(+) AND REF_PAYS.PAY_ID = vue.ID_DESTINATION(+) AND REF_VILLE.VILLE = 'BDX' GROUP BY PAYS,to_char(date_depart,'WW') ORDER BY SEMAINE
ORA-01417: une table peut être de jointure externe pour une autre table au moins
c'est quoi les (+) c'est outer join ?
Est-ce que tu pourrais préfixer tes colonnes, car là, on sait pas qu'est-ce qui appartient à qui.....
(en fait je crain que tu demandes un trucs physiquement impossible mais je voudrais en avoir le coeur net... :aie: )
à nuke_y, 2 remarques:
1- Il ne faut pas faire un count(*) mais un count sur un élément de l'entité facultative, sinon tu auras toujours au moins 1....
2- ta requête ne marche pas parceque l'entité facultative se trouve au milieu du parcours... donc si c'est facultatif, c'est qu'il peut ne pas y avoir de données, et si y'a pas de donnée, comme faire le lien etre les 2 autres entités.... ;)
moi je "jointurerai" plutôt avec :
Code:
1
2
3
4
5
6 (SELECT 44 as num FROM dual UNION ALL SELECT 45 FROM dual ... UNION ALL SELECT 52 FROM dual) semaine
moi aussi je me demande si c'est possible je sais que pour la semaine 44 cette condition n'est pas rempli REF_VILLE.VILLE = 'BDX' mais afficher la dispo 0 pour la semaine 44.
Code:
1
2
3
4
5
6
7 SELECT to_char(VUE.date_depart,'WW') AS SEMAINE,REF_PAYS.PAYS, COUNT (*) AS DISPO FROM VUE,REF_PAYS,REF_VILLE WHERE UPPER(REF_PAYS.PAYS) IN ('MAR') AND to_char(VUE.date_depart,'WW') IN (44,45,46,47,48,49,50,51,52) AND VUE.ID_VILLE_DEPART = REF_VILLE.VIL_ID AND vue.ID_DESTINATION = REF_PAYS.PAY_ID AND REF_VILLE.VILLE = 'BDX' GROUP BY REF_PAYS.PAYS,to_char(VUE.date_depart,'WW') ORDER BY SEMAINE
Effectivement, j'ai mis les (+) mais j'ai pas fait gaffe au fait que la table incomplète est justement la table pivot :?Citation:
Envoyé par remi4444
il reste le UNION de Fred...
c'est bien ce que je craignais, comment veux tu qu'il affiche un '44' (par exemple) alors que cette donnée n'existe nulle part :aie: ?
Oracle ne va pas deviner à ta place les valeurs d'axes que tu veux afficher, ces axes doivent correspondre à des entités bien solides... Pour commencer, il faut donc que tu ais une entité qui contienne toutes tes valeurs de semaines (soit en les mettant dans une tables, soit en utilisant la vue dynamique de Fred).
Ensuite il faut que tu fasses une sous-requête dynamique qui fasse un produit cartésien pour constituer toutes tes possibilités et ensuite du fais un parcours par jointure externe.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 select AXES.NUM, AXES.PAYS, COUNT (VUE.ID_DESTINATION) from ( SELECT REF_PAYS.PAYS, REF_VILLE.VILLE, REF_PAYS.PAY_ID, REF_VILLE.VIL_ID , SEMAINE.NUM (SELECT 1 AS num FROM dual UNION ALL SELECT 2 FROM dual ... UNION ALL SELECT 52 FROM dual UNION ALL SELECT 53 FROM dual) semaine ) AXES, VUE WHERE to_char(VUE.date_depart(+),'WW') = AXES.NUM AND VUE.ID_VILLE_DEPART(+) = AXES.VIL_ID AND vue.ID_DESTINATION(+) = AXES.PAY_ID AND AXES.VILLE = 'BDX' AND AXES.NUM in (44,45,46,47,48,49,50,51,52) GROUP BY AXES.PAYS,AXES.NUM ORDER BY AXES.NUM
cette donnée est bien dans ma vue. mais c'est cette condition qui n'est pas rempli AND REF_VILLE.VIL_LABEL = 'PARIS'
mais je vois le probleme...
je pensai que c'etait plus simple.
merci a tous.
Il faut que ta requête fonctionne meme si ta vue est completement vide, c'est en ce sens que je pense que ta donnée n'est pas si obligatoire que ça dans ta vue....