afficher ligne group by meme si pas de valeurs

afficher ligne group by meme si pas de valeurs - SQL/NoSQL - Programmation

Marsh Posté le 18-04-2006 à 09:59:17    

Salut ;)
 
Voila mon probleme :
D'un coté j'ai une table ETAT_DOSSIER contenant un code_etat et un titre_etat pour chaqu'un de mes 8 etats
De l'autre j'ai une table DOSSIER défini par un code_dossier
 
Je fais une requete qui pour chaque etat de dossier me compte le nombre de dossier :

Code :
  1. SELECT COUNT( DISTINCT D.code_dossier ) AS 'Nombre de dossiers', E.lib_etat AS 'Etat'
  2. FROM DOSSIER D, ETAT_DOSSIER E
  3. WHERE D.code_etat = E.code_etat
  4. GROUP BY E.code_etat
  5. ORDER BY E.code_etat


 
Ca marche mais probleme : je n'ai en retour que les ETATS de dossier qui correspondent à au moins un dossier.
Par exemple: l'etat "DOSSIER CLOTURé" ne correspond pour l'instant à aucun dossier, et dans le resultat de la requete au lieu d'avoir :

Code :
  1. Dossier cloturé : 0


je n'ai carrément pas de ligne.
 
Comment remédier a cela?  
 
merci ! :hello:

Reply

Marsh Posté le 18-04-2006 à 09:59:17   

Reply

Marsh Posté le 18-04-2006 à 10:37:27    

Il te faut une jointure externe :)
 

Code :
  1. SELECT COUNT( DISTINCT D.code_dossier ) AS 'Nombre de dossiers', E.lib_etat AS 'Etat'
  2. FROM ETAT_DOSSIER E
  3. LEFT JOIN DOSSIER D ON D.code_etat = E.code_etat
  4. GROUP BY E.code_etat
  5. ORDER BY E.code_etat;

Reply

Marsh Posté le 18-04-2006 à 10:46:21    

merci beaucoup :)
 
Je ne connaissais pas ce type de jointure, c'est intéressant .
 
Autre petite question : J'utilise cette requete pour afficher les resultat sur une page web.
Comment puis-je récupérer les noms des champs ('Etat' et 'Nombre de dossiers') automatiquement pour les mettre en en-tete de tableau (dans un <th></th> ) ?
j'en ai besoin pour traiter pas mal de requetes différentes dont l'ordre, le nombre et la nature des champs sont différents.
 
merci de ton aide :)
:hello:

Reply

Marsh Posté le 18-04-2006 à 11:12:17    

J'imagine que tu utilises du code PHP pour attaquer une base mySql :
 
http://www.manuelphp.com/php/funct [...] d-name.php

Reply

Marsh Posté le 18-04-2006 à 11:21:03    

Merci encore, c'est parfait :)
 
Bonne journée

Reply

Marsh Posté le 18-04-2006 à 14:51:37    

C'est encore moi :)
 
Bon, j'ai vraiment du mal avec les jointures, surtout que la je dois en faire 2 en meme temps :
 
SELECT Z.lib_zone_geo AS 'Zone géographique', COUNT(distinct D.code_dossier) AS 'Nombre de bénéficiaires'  
                     FROM (ZONE_GEO Z
                     LEFT JOIN DEMANDEUR M ON Z.code_zone_geo = M.code_zone_geo)
                     INNER JOIN DOSSIER D ON M.code_demandeur = D.code_demandeur
                     WHERE code_etat = 8  
                     GROUP BY Z.code_zone_geo
                     ORDER BY lib_zone_geo
 
En gros, je veux le nombre de dossier par zone_geo où code_etat = 8
Actuellement ma requete affiche bien les dossiers dans ce cas mais je voudrais aussi qu'elle m'affiche TOUTES les zone_geo meme si il ya 0 dossiers (meme probleme que 3 post au dessus en fait)
 
Je continue a bidouiller de mon coté :(

Reply

Marsh Posté le 18-04-2006 à 15:05:54    

Peut-être en mettant DEMANDEUR comme table principale et les 2 autre tables en jointure externe ...
 
SELECT Z.lib_zone_geo AS 'Zone géographique', COUNT(distinct D.code_dossier) AS 'Nombre de bénéficiaires'
FROM DEMANDEUR M
LEFT JOIN ZONE_GEO Z ON Z.code_zone_geo = M.code_zone_geo
LEFT JOIN DOSSIER D ON M.code_demandeur = D.code_demandeur
WHERE Z.code_etat = 8
GROUP BY Z.code_zone_geo
ORDER BY lib_zone_geo;

Reply

Marsh Posté le 18-04-2006 à 15:11:46    

Non toujours le meme résultat :(

Reply

Marsh Posté le 18-04-2006 à 15:21:36    

Et comme ça ?
 
SELECT Z.lib_zone_geo AS Zone_geographique, COUNT(DISTINCT D.code_dossier) AS Nombre_de_beneficiaires  
FROM ZONE_GEO Z
LEFT JOIN DEMANDEUR M ON Z.code_zone_geo = M.code_zone_geo
LEFT JOIN DOSSIER D ON M.code_demandeur = D.code_demandeur
WHERE code_etat = 8
GROUP BY Z.lib_zone_geo
ORDER BY Z.lib_zone_geo;

Reply

Marsh Posté le 18-04-2006 à 15:27:11    

Non plus :(
 
Ca fait 2h que j'essaye toutes les solutions avec des left join right join.. Je commence a m'arracher les cheveux la en fait.
 
La seule requete qui marche c'est :
SELECT Z.lib_zone_geo AS 'Zone géographique', COUNT(distinct M.code_demandeur) AS 'Nombre de bénéficiaires'  
                     FROM (ZONE_GEO Z
                     LEFT JOIN DEMANDEUR M ON Z.code_zone_geo = M.code_zone_geo)
 
                     GROUP BY Z.code_zone_geo
 
Mais c'est pas ce que je veux, dès que je rajoute une jointure et donc une table.. tout plante!
 
Jvais craquer dans pas longtemps :d

Reply

Marsh Posté le 18-04-2006 à 15:27:11   

Reply

Marsh Posté le 18-04-2006 à 15:31:04    

Déjà, tu ne devrais pas faire un group by sur code_zone_geo et afficher lib_zone_geo ... mySql te laisse faire mais en réalité il doit afficher une valeur au hasard pour lib_zone_geo q'il y en a plusieurs par code_zone_geo !
 
D'autre part, tu tournes sur quelle version de mySql ?
 
Tu devrais pouvoir t'en sortir avec une sous-requête, du style LEFT JOIN (SELECT ... FROM table1, table2), ou encore LEFT JOIN (SELECT ... FROM table1 LEFT JOIN table2 ...).

Reply

Marsh Posté le 18-04-2006 à 15:54:38    

Alors pour le group by, oui, il est foireux, mais le problme reste le meme :(
 
version sql : MySQL - 4.0.26-debug
 
je vais tenter avec sous-requete mais jsuis au bord du suicide la

Reply

Marsh Posté le 18-04-2006 à 16:37:02    

Bon allez ca me les brise, je ferais autant de requete qu'il ya de zone geo, et BASTA
 
Merci pour ton aide en tous cas.
 
@+

Reply

Sujets relatifs:

Leave a Replay

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