[Edit] Forcer Oracle à retourner une ligne avec des 0

Forcer Oracle à retourner une ligne avec des 0 [Edit] - SQL/NoSQL - Programmation

Marsh Posté le 31-05-2005 à 13:44:20    

Bonjour,
 
J'ai un petit soucis avec Oracle.
En effet, je désire faire une requête qui renvoie le CA TTC d'un magasin pour l'année précédente. Or, certains magasins n'étaient pas ouvert l'année précédente, donc Oracle supprime COMPLETEMENT la ligne de ce magasin. Moi je voudrais qu'il me mette la ligne avec, quand il n'a pas de valeur, un '0' ou quelque chose comme ca.
 
Voici un exemple de requête :  
 

Code :
  1. SELECT MIN(F_CA.CAMO/F_CA.NBJO) as "CA Jours Objectif",
  2.    SITES.CODE_SITE_GCO as "Libellé Site",
  3.    SITES.CODE_SITE_CPT as "Libellé Site Compta",
  4.    decode(SUM(F_STAT_VENTE_M.CA_TTC),NULL,'pas de valeur'
  5.             ,NOT NULL,SUM(F_STAT_VENTE_M.CA_TTC))"CA HT en Cours",
  6.    SUM(F_STAT_VENTE_M.CA_TTC/F_CA.NBJR) as "M/AN N-1",
  7.    F_STAT_VENTE_M.ID_MOIS
  8.  
  9.  
  10. FROM F_CA,F_STAT_VENTE_M,SITES,ARTICLES,DIR_REG
  11. WHERE F_CA.ID_MOIS=concat(substr((to_char(sysdate-365, 'YYYY')),1,4),substr((to_char(sysdate, 'MM')),1,2))
  12. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  13. AND F_CA.ID_MOIS=F_STAT_VENTE_M.ID_MOIS
  14. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  15. AND F_STAT_VENTE_M.ID_ART=ARTICLES.ID_ART
  16. AND F_CA.ID_SITE=SITES.ID_SITE
  17. AND SITES.CODE_DIR_REG=DIR_REG.CODE_DIR_REG
  18. GROUP BY SITES.CODE_SITE_GCO,SITES.CODE_SITE_CPT,F_STAT_VENTE_M.ID_MOIS


 
 
Merci d'avance,
 
m.


Message édité par jay-jay69 le 31-05-2005 à 18:50:06
Reply

Marsh Posté le 31-05-2005 à 13:44:20   

Reply

Marsh Posté le 31-05-2005 à 13:57:27    

tu est sur la bonne voie à mon avis ...  
tu est sur que ta fonction 'decode' est bien utilisée ?  
quel est le pb sur ta requête ??  

Reply

Marsh Posté le 31-05-2005 à 14:01:43    

Code :
  1. SELECT MIN(F_CA.CAMO/F_CA.NBJO) as "CA Jours Objectif",
  2.    SITES.CODE_SITE_GCO as "Libellé Site",
  3.    SITES.CODE_SITE_CPT as "Libellé Site Compta",
  4.    decode(SUM(F_STAT_VENTE_M.CA_TTC),NULL,'pas de valeurs'                                                 // apparemment il ne se trouve jamais dans ce cas la
  5.             ,NOT NULL,SUM(F_STAT_VENTE_M.CA_TTC))"CA HT en Cours",              // ici, le NOT NULL, il aime pas trop trop
  6.    SUM(F_STAT_VENTE_M.CA_TTC/F_CA.NBJR) as "M/AN N-1",
  7.    F_STAT_VENTE_M.ID_MOIS
  8.  
  9.  
  10. FROM F_CA,F_STAT_VENTE_M,SITES,ARTICLES,DIR_REG
  11. WHERE F_CA.ID_MOIS=concat(substr((to_char(sysdate-365, 'YYYY')),1,4),substr((to_char(sysdate, 'MM')),1,2))
  12. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  13. AND F_CA.ID_MOIS=F_STAT_VENTE_M.ID_MOIS
  14. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  15. AND F_STAT_VENTE_M.ID_ART=ARTICLES.ID_ART
  16. AND F_CA.ID_SITE=SITES.ID_SITE
  17. AND SITES.CODE_DIR_REG=DIR_REG.CODE_DIR_REG
  18. GROUP BY SITES.CODE_SITE_GCO,SITES.CODE_SITE_CPT,F_STAT_VENTE_M.ID_MOIS


 
 
Je trouve ca bien bizarre... Tu as une idée toi?

Reply

Marsh Posté le 31-05-2005 à 14:25:17    

Je viens de penser à la fonction 'nvl' mais ca ne marche pas non plus...
Ca me saoule!

Reply

Marsh Posté le 31-05-2005 à 14:26:21    

Voila avec 'nvl' :
 

Code :
  1. SELECT MIN(F_CA.CAMO/F_CA.NBJO) as "CA Jours Objectif",
  2.    SITES.CODE_SITE_GCO as "Libellé Site",
  3.    SITES.CODE_SITE_CPT as "Libellé Site Compta",
  4.    NVL(SUM(F_STAT_VENTE_M.CA_TTC),0) as "CA TTC",
  5.    NVL(SUM(F_STAT_VENTE_M.CA_TTC/F_CA.NBJR),0) as "M/AN N-1"
  6.  
  7. FROM F_CA,F_STAT_VENTE_M,SITES,ARTICLES,DIR_REG
  8. WHERE F_CA.ID_MOIS=concat(substr((to_char(sysdate-365, 'YYYY')),1,4),substr((to_char(sysdate, 'MM')),1,2))
  9. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  10. AND F_CA.ID_MOIS=F_STAT_VENTE_M.ID_MOIS
  11. AND F_CA.ID_SITE=F_STAT_VENTE_M.ID_SITE
  12. AND F_STAT_VENTE_M.ID_ART=ARTICLES.ID_ART
  13. AND F_CA.ID_SITE=SITES.ID_SITE
  14. AND SITES.CODE_DIR_REG=DIR_REG.CODE_DIR_REG
  15. AND SITES.ID_SITE='58'
  16. GROUP BY SITES.CODE_SITE_GCO,SITES.CODE_SITE_CPT

Reply

Marsh Posté le 31-05-2005 à 15:50:57    

personne?

Reply

Marsh Posté le 31-05-2005 à 16:39:47    

sinon pour faire simple ta qu'a faire une union du genre :
 
select (ta requete ...)  
union
select magasin , 0 as chiffree_daffaire from ...

Reply

Marsh Posté le 31-05-2005 à 17:45:13    

En fait, je viens de voir, il me met a chake fois :
"No Rows Returned" ...
 
Je craque...

Reply

Marsh Posté le 31-05-2005 à 18:01:03    

On peut forcer Oracle a renvoyer une ligne au minimum?

Reply

Marsh Posté le 31-05-2005 à 18:47:55    

up?

Reply

Marsh Posté le 31-05-2005 à 18:47:55   

Reply

Marsh Posté le 31-05-2005 à 20:34:33    

et en utilisant un left join entre la table des sites et des CA (j'ai pas regarde en profondeur mais c'est l'idee) plutot qu'en les liant dans le where?

Reply

Marsh Posté le 31-05-2005 à 22:06:21    

en fait, je sais pas si j'ai été clair, mais le fait que ma requete ne donne pas de resultat est normal. Mais je veux simplement qu'il me renvoie une ligne avec des 0 au lieu de rien du tout.
 
Je pensais pas que c'etait si compliqué... :(

Reply

Marsh Posté le 01-06-2005 à 10:46:30    

si tu veux une ligne avec des zéros, tu fais select 0 as truc, ,0 as machin ,0 as bidule,0 as youpizero,0 as zero,0 as truc...
 
 
je vois pas l'intérêt de vouloir remplacer, par requêtage en plus, le contenu vide d'un résultat de requête par une ligne de zéros ...
ce qui est intéressant par contre c de pouvoir mettre une valeur autre que null si des CHAMPS sont nulls, mais si ta requête ne renvoie rien, il n'y a rien à remplacer à priori ....

Reply

Marsh Posté le 01-06-2005 à 12:20:49    

Nan, le coup du UNION avec les 0 me semble la meilleur solution.

Reply

Marsh Posté le 01-06-2005 à 12:27:28    

Oui c'est ce que j'ai fait... Ca marche bien... Je vous remercie!
 
m.

Reply

Sujets relatifs:

Leave a Replay

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