chui pas vraiment fort en sql et je me galère depuis un certain tps déjà pour faire une ptite requête toute bête je suis sur !
bon je cherche à afficher les champs ci-dessous avec certaines conditions :
id_etape = 91 ou id_etape = 92
dt_envoie >= 03/08/05 et est affiché pour la ligne ou dt_real est le plus récent
Pour l’instant j’arrive au résultat ci-dessous mais je souhaiterais n’avoir qu’une ligne (ceci est un extrait de mon résultat)
Voici ma requête :
SELECT DISTINCT dbo.ETAPEPRJ.id_Projet AS projet, dbo.FILIERE.lb_LibFiliere AS filiere, dbo.ETAPEPRJ.id_TpEtpPrj AS id_etape, dbo.ETAPEPRJ.dt_EnvoiEtapePrj AS dt_envoie, dbo.ETAPEPRJ.dt_RealEtapePrj AS dt_real
FROM dbo.ETAPEPRJ
INNER JOIN dbo.PROJET
ON dbo.ETAPEPRJ.id_Projet = dbo.PROJET.sy_Projet
INNER JOIN dbo.FILIERE
ON dbo.PROJET.id_Filiere = dbo.FILIERE.sy_Filiere
WHERE (dbo.ETAPEPRJ.id_TpEtpPrj = 91)
AND (dbo.ETAPEPRJ.dt_EnvoiEtapePrj >= CONVERT(DATETIME, '2005-08-03 00:00:00', 102)) OR (dbo.ETAPEPRJ.id_TpEtpPrj = 92)
AND (dbo.ETAPEPRJ.dt_EnvoiEtapePrj >= CONVERT(DATETIME, '2005-08-03 00:00:00', 102))
ORDER BY dbo.ETAPEPRJ.id_Projet, dbo.FILIERE.lb_LibFiliere, dbo.ETAPEPRJ.dt_EnvoiEtapePrj
Vu. (j’ai tout lu :transpiration: )
le truc c’est que tu ne veux qu’une seule ligne par ensemble “projet – filiere – id_etape – dt_envoie” d’ou le distinct.
Le problème, c’est que tu met dt_real dans ton distinct donc il t’ffiche toutes les valeurs de dt_real.
Si tu n’as pas besoin de cette dernier colonne, enlève le du distinct.
sinon:
-enlève le dstinct et utilise plutôt un group by “projet – filiere – id_etape – dt_envoie” (avec la bonne syntaxe bien sûr, a la fin, et avec le nom complet des colonnes)
met un max(dt_real) dans ton select: ça te donnera la dernière date
et question de forme, tu doit pouvoir écrire des constantes dates en SQL sans passer par un convert, essaye de touver ça (moi plus m’en rappeler)
Je ne sais pas si c’est ce que tu me conseillais, mais quoi qu’il en soit, cette requête me donne le même résultat :
SELECT dbo.ETAPEPRJ.id_Projet AS projet, dbo.FILIERE.lb_LibFiliere AS filiere, dbo.ETAPEPRJ.id_TpEtpPrj AS id_etape, dbo.ETAPEPRJ.dt_EnvoiEtapePrj AS dt_envoie, MAX(dbo.ETAPEPRJ.dt_RealEtapePrj) AS dt_real
FROM dbo.ETAPEPRJ
INNER JOIN dbo.PROJET
ON dbo.ETAPEPRJ.id_Projet = dbo.PROJET.sy_Projet
INNER JOIN dbo.FILIERE
ON dbo.PROJET.id_Filiere = dbo.FILIERE.sy_Filiere
WHERE (dbo.ETAPEPRJ.id_TpEtpPrj = 91)
AND (dbo.ETAPEPRJ.dt_EnvoiEtapePrj >= CONVERT(DATETIME, '2005-08-03 00:00:00', 102))
OR (dbo.ETAPEPRJ.id_TpEtpPrj = 92)
AND (dbo.ETAPEPRJ.dt_EnvoiEtapePrj >= CONVERT(DATETIME, '2005-08-03 00:00:00', 102))
GROUP BY dbo.ETAPEPRJ.id_Projet, dbo.FILIERE.lb_LibFiliere, dbo.ETAPEPRJ.id_TpEtpPrj, dbo.ETAPEPRJ.dt_EnvoiEtapePrj
ORDER BY dbo.ETAPEPRJ.id_Projet, dbo.FILIERE.lb_LibFiliere, dbo.ETAPEPRJ.dt_EnvoiEtapePrj
D’autre part, le Distinct vaut pour tous les champs non ??
Peut-on mettre une clause distinct par champs ??
Oui, c’était ça, et le group by est plus souple que le distinct, le distinct va s’appliquer sur tous les champs.
On utilise le group by, justement pour mettre la function “Max”
bizarre, ça devrait marcher, essaye toujours d’enlever quelques colonne du group by pour debugger, par exemple la date que j’ai mis en rouge. (edit: marche pas, c’est cette date dbo.ETAPEPRJ.dt_EnvoiEtapePrj)
sinon, faire joujou avec le order by, soit l’enlever, soit mettre exactement les mêmes colones que dans group by. C’est curieux, en DB2, le moteur me jetait si une colonne group by n’était pas triée.
le pb c’est que si je supprime le champs :
dbo.ETAPEPRJ.dt_EnvoiEtapePrj
de ma requête, ça va effectivement marcher mais je ne pourrai alors plus filtrer mes enregistrements (>= 03/08/2005) !!
De plus j’ai déjà pas mal fais joujou avec les group by et autre sans parvenir au résultat que je souhaite !!
Si une âme charitable veux bin se pencher sur mon cas, lors d’un moment perdu, et la requête capable de répondre aux conditions suivantes :
id_etape = 91 ou 92
dt_envoie >= 03/08/2005 et n’est affiché que pour le projet pour lequel dt_real est le plus récent
classement par filiere croissant puis dt_envoie croissant
Enlève le aussi du from :sarcastic:
Bref, fait des essais, met nous les résultats, il faut cibler le problème. Même si on est pas très au point, de savoir ce que tu fais pourrait nous aider.
T’as donc un dédoublement des résultats sur la seconde date, une est bonne, mais pas l’autre. Ca veut dire que t’as un critère WHERE X = Y qui ne se vérifie pas correctement. Enfin c’est comme ca que je le comprend, au regard de mes maigres compétences en mysql. J’ai eu un problème qui y ressemble récement, je faisais une requête genre : SELECT transporteurs.nom,dossiers.id FROM transporteurs,dossiers, WHERE transporteurs.idDossier = dossiers.id; et j’avais des doublons comme dans ton résultat là…
arg y a quelque mois je ne sais plus sur quel forum(c’était pas cluclu je crois) un gars avait un problème identique au tien, je ne trouve plus le topic en question.
me semble qu’il fallait utiliser une table temporaire
D’après moi ça n’est pas possible car même en utilisant max et distinct, il va comparer chaque lignes. Mais comme les 2 champs contenants des dates sont généralement différent, il considérera que se sont des lignes différents alors même que tous les autres champs sont identiques. Par conséquent il appliquera max à mon dernier champs date mais celui-ci étant unique pour un projet donné, il me renverra toutes les lignes …
Mikmak tu m’intéresses pour le topic identique si tu le retrouves …
Bon en fait, je me suis débrouillé en créant une vue intermédiaire regroupant les lignes dont les dates étaient >= à celle donnée.
Et c’est sur ce résultat que j’ai appliqué sur les 2 champs date la fonction max par l’intermédiaire d’une seconde vue !!
Pas hyper propre mais bon ça se voit pas pour l’utilisateur !!!