Forum Clubic

[SQL] Requête toute simple

Bonjour,

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

Résultat de la requête incorrecte :

projet – filiere – id_etape – dt_envoie – dt_real


3505 NT4 91 19/08/05 23/06/05
3505 NT4 92 19/08/05 04/04/05
3505 NT4 92 22/08/05 23/06/05
3688 NT4 92 17/08/05 11/08/05
3688 NT4 92 22/08/05 20/06/05

Résultat de la requête souhaitée :

projet – filiere – id_etape – dt_envoie – dt_real


3505 NT4 91 19/08/05 23/06/05
3505 NT4 92 22/08/05 23/06/05
3688 NT4 92 17/08/05 11/08/05

QQun ??

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 ??

Enfin ça coince toujours !!

Merci pour ton aide en tout cas !

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 :

Voici ma table :

projet – filiere – id_etape – dt_envoie – dt_real


3505 NT4 91 19/08/05 23/06/05
3505 NT4 92 19/08/05 04/04/05
3505 NT4 92 22/08/05 23/06/05
3688 NT4 92 17/08/05 11/08/05
3688 NT4 92 22/08/05 20/06/05

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

le résultat attendu est :

projet – filiere – id_etape – dt_envoie – dt_real


3505 NT4 91 19/08/05 23/06/05
3505 NT4 92 22/08/05 23/06/05
3688 NT4 92 17/08/05 11/08/05

chuss !!

Je ne te dis pas de l’enlever de la requête, juste du group by.

bin ouais, mais tu peux pas séléctionner (visiblement) qqch si ce champs n’apparaît pas dans le GROUP BY !! le requêteur te met un msg d’erreur !!

Il doit manquer un champ = champ car t’as les résultats dédoublés pour des valeurs de tables qui ne devraient pas être liées.

Enfin je ne suis PAS très compétent là dedans, mais quand je faisais des requêtes avec jointures sur deux tables j’avais souvent ce blem !

??

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.

D’après ce que t’as posté :

3505 NT4 91 19/08/05 23/06/05 < bon
3505 NT4 92 19/08/05 04/04/05 < faux
3505 NT4 92 22/08/05 23/06/05 < bon
3688 NT4 92 22/08/05 20/06/05 < faux

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 :wink:

A+

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 !!!

Merci aux participants !

A+