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 11/12/2006, 13h36   #1
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
Par défaut Remplacer no rows returned par 0

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.
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 13h59   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Utilisez la pseudo table DUAL avec un COALESCE ou un decode.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 14h08   #3
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
A priori, Count retounre toujours une valeur non ?
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 14h23   #4
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Citation:
Envoyé par Tofalu
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" alors il faut capturer l'exception dans un bloc :
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;
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 16h10   #5
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
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.
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
J'avais regardé déjà COALESCE mais je n'ai pas abouti.
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 16h26   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 16h46   #7
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
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.
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 16h51   #8
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
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.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 16h52   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Citation:
Envoyé par grizzz
Dommage, la solution se trouvait au milieu de tes petits points.... (par les jointures externes...)
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h26   #10
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
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 pense qu'il y a tout.

Je n'ai aucun resultat pour la semaine 44 je voudrai un 0
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h30   #11
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
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
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h39   #12
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
ORA-01417: une table peut être de jointure externe pour une autre table au moins

c'est quoi les (+) c'est outer join ?
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h40   #13
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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... )

à 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....
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h48   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 17h58   #15
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
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
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 18h05   #16
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Citation:
Envoyé par remi4444
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....
Effectivement, j'ai mis les (+) mais j'ai pas fait gaffe au fait que la table incomplète est justement la table pivot

il reste le UNION de Fred...
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 18h18   #17
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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 ?
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
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 19h24   #18
Invité régulier
 
Inscription : janvier 2004
Messages : 52
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 52
Points : 7
Points : 7
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.
grizzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 19h38   #19
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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....
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h25.


 
 
 
 
Partenaires

Hébergement Web