Page 1 sur 1

GROUP BY et ORDER BY possible ? (suite)

Posté : 20 juin 2013, 11:25
par lacfab
Hello,
Pour faire suite à ce post : sql-bases-donnees/group-order-possible-t266897.html
Je dois approfondir ...

J'ai quand même besoin de résoudre mon problème. La date qui est prise en compte n'est pas la date la plus vieille, et c'est vraiment gênant.

Voici la requete :
SELECT * FROM BOG_DOSSIERS, BOG_SOUSDOSSIERS, BOG_ENTREPRISE, BOG_FACTURES WHERE dossiers_entreprise_id=entreprise_id AND dossiers_id=sousdossiers_dossiers_id AND factures_dossier_id=dossiers_id AND factures_numero='' AND factures_date='0000-00-00' AND sousdossiers_dateexpe<='$date' GROUP BY factures_id" ORDER BY dossiers_id asc";
Donc je dois sortir une liste de dossiers :
- dont le numéro de facture est vierge
- dont la date de facturation est vierge
- dont la date d'expédition est inférieure ou égale à aujourd'hui

Pour un dossier, je peux avoir plusieurs sous-dossiers avec des dates d'expédition différentes. Pour ma requête, j'ai besoin de la date du dossier qui part en dernier. Comment je peux faire ? j'ai testé avec max(sousdossiers_dateexpe) mais ça ne marche pas.

PS : pour vous mettre la requête, j'ai mis * à la place de tous mes champs après SELECT pour alléger un peu.

Merci d'avance :)

Re: GROUP BY et ORDER BY possible ? (suite)

Posté : 20 juin 2013, 13:53
par Mazarini
SELECT *,max(s1.sousdossiers_dateexpe) 
FROM BOG_DOSSIERS, BOG_SOUSDOSSIERS s1, BOG_SOUSDOSSIERS s2, BOG_ENTREPRISE, BOG_FACTURES 
WHERE dossiers_entreprise_id=entreprise_id 
AND      dossiers_id=s1.sousdossiers_dossiers_id 
AND      dossiers_id=s2.sousdossiers_dossiers_id 
AND factures_dossier_id=dossiers_id 
AND factures_numero='' 
AND factures_date='0000-00-00' 
AND s2.sousdossiers_dateexpe<='$date' 
GROUP BY factures_id 
ORDER BY dossiers_id asc;
ou
SELECT *
FROM BOG_DOSSIERS, BOG_SOUSDOSSIERS, BOG_ENTREPRISE, BOG_FACTURES 
WHERE dossiers_entreprise_id=entreprise_id 
AND      dossiers_id=sousdossiers_dossiers_id 
AND factures_dossier_id=dossiers_id 
AND factures_numero='' 
AND factures_date='0000-00-00' 
GROUP BY factures_id
HAVING  MAX(sousdossiers_dateexpe) <='$date' 
ORDER BY dossiers_id asc;
Mais tu es trop imprecis. J'ai par exemple un doute sur "dont le/un numéro de facture est vierge" et bien d'autres.

Re: GROUP BY et ORDER BY possible ? (suite)

Posté : 20 juin 2013, 15:33
par lacfab
Merci, j'ai avancé !
SELECT dossiers_id, dossiers_typetravaux_id, dossiers_entreprise_id, entreprise_nom, dossiers_nom, max(s1.sousdossiers_dateexpe), s2.sousdossiers_dateexpe, s2.sousdossiers_statuts_id, factures_id, factures_montant
FROM BOG_DOSSIERS, BOG_SOUSDOSSIERS s1, BOG_SOUSDOSSIERS s2, BOG_ENTREPRISE, BOG_FACTURES
WHERE dossiers_entreprise_id=entreprise_id
AND dossiers_id=s1.sousdossiers_dossiers_id
AND dossiers_id=s2.sousdossiers_dossiers_id
AND factures_dossier_id=dossiers_id
AND entreprise_id!='105'
AND factures_numero=''
AND factures_date='0000-00-00'
AND s2.sousdossiers_statuts_id='8'
AND s1.sousdossiers_dateexpe<='$date'
GROUP BY factures_id
ORDER BY max(s1.sousdossiers_dateexpe) asc, dossiers_id asc;
Voici ma requête complète.
Donc là elle marche, MAIS elle m'affiche les dossiers ayant au moins un sous-dossier avec un statut '8'. Je voudrais qu'elle ne m'affiche que les dossiers dont TOUS les sous-dossiers sont au statut 8. J'ai fais divers essais mais je varie entre erreurs et 12000 résultats LOL

Re: GROUP BY et ORDER BY possible ? (suite)

Posté : 20 juin 2013, 17:12
par lacfab
Re,

Je crois que j'ai trouvé, j'ai fais un AVG sur les statuts ... je sais pas si c'est la bonne solution mais ça semble marcher ...
SELECT dossiers_id, dossiers_typetravaux_id, dossiers_entreprise_id, entreprise_nom, dossiers_nom, max(s1.sousdossiers_dateexpe) as thedate, s2.sousdossiers_dateexpe, s2.sousdossiers_statuts_id, factures_id, factures_montant
FROM BOG_DOSSIERS, BOG_SOUSDOSSIERS s1, BOG_SOUSDOSSIERS s2, BOG_ENTREPRISE, BOG_FACTURES
WHERE dossiers_entreprise_id=entreprise_id
AND dossiers_id=s1.sousdossiers_dossiers_id
AND dossiers_id=s2.sousdossiers_dossiers_id
AND factures_dossier_id=dossiers_id
AND entreprise_id!='105'
AND factures_numero=''
AND factures_date='0000-00-00'
AND s1.sousdossiers_dateexpe<='$date'
GROUP BY factures_id HAVING AVG(s2.sousdossiers_statuts_id)='8'
ORDER BY max(s1.sousdossiers_dateexpe) asc, dossiers_id asc

Re: GROUP BY et ORDER BY possible ? (suite)

Posté : 20 juin 2013, 21:02
par Mazarini
Je mettrai plutôt :
HAVING MAX(s1.sousdossiers_statuts_id)=8 and MIN(s1.sousdossiers_statuts_id)=8

avec s1, sinon avec s2 ca ne prend pas en compte les sous-dossiers > $date