Requête SQL

Résolu/Fermé
Nico0044 - 23 mai 2008 à 11:01
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 - 23 mai 2008 à 12:07
Bonjour à toutes et tous.
J'ai un soucis au niveau d'une requête qui n'affiche pas ce que je souhaite.
Voici ma requête:

Select max(MOROUT.N°poste), MOROUT.N°de fabrication,MOROUT.Nomopération
FROM MOROUT
GROUP BY MOROUT.N°de fabrication

Cette requête ne me donne pas ce que souhaite car ce que je veux c'est avoir le numéro maximum du N°poste groupé par N°de fabrication et mettre l'opération qui correspond.
Mais le problème c'est qu'il m'affiche les N°poste groupé par Ordre de fabrication et par opérations ce que je ne veux pas.

Exemple de ce que j'ai:
N°de fabrication:1 N°poste:5 Nom opération: arrière
N°de fabrication:1 N°poste: 10 Nom opération: avant
N°de fabrication:1 N°poste: 20 Nom opération: droite
N°de fabrication:2 N°poste: 15 Nom opération: bas
N°de fabrication:2 N°poste: 25 Nom opération: haut

Exemple de ce que je veux:
N° de fabrication:1 N°poste(le max): 20 ( car 20>5 et 10) Nom opération: droite
N°de fabrication:2 N°poste: 25 Nom opération: haut

4 réponses

^^
dans ton group by, il faut aussi que tu mettes :
MOROUT.Nomopération 

essaye, ca marchera peut être!
^^
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 11:11
Trois remarques préliminaires :
1. simplifie ta requête en supprimant les MOROUT. qui ne servent à rien puisque tu ne travailles que sur une table
2. évite les caractères comme '°', 'é'... dans les noms de colonnes sql
3. ton SELECT ne peux pas marcher car il contient des noms de colonnes avec des espaces
SELECT max( numPoste ), numFabrication, nomOperation
   FROM MOROUT
   GROUP numFabrication


Ton pb proprement dit vient de la présence de nomOperation dans la liste des variables sélectées : quelle valeur afficher pour un groupe par numFabrication qui contiendrait plusieurs valeurs de nomOperation ?

Il faut donc retirer nomOperation de cette liste.
0
Merci pour vos réponses: pour le fait que je n'ai pas "group by nom opération" c'est justement la le problème j'aimerais l'enlever du group by mais Microsoft query le rajoute tout seul ce qui me donne une requête fausse.

Croy il me faut la liste des nom d'opérations car ce que je veux c'est savoir la dernière opération réalisée par N° de fabrication et on le sait avec le maximum de N°poste.
Si vous avez une idée ça m'aiderais grandement.
Merci d'avance
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 11:28
Il faut retirer nomOperation de la liste apès le SELECT.

Si tu as un besoin spécifique, pourrais-tu nous donner un exemple de table de données (10 enregistrements au plus) et ce que tu voudrais obtenir.
0
Croy je ne peut pas retirer le nom opération car il faut que cette info soit visible je te met un exemple:
N°de fabrication:1 N°poste:5 Nom opération: arrière
N°de fabrication:1 N°poste: 10 Nom opération: avant
N°de fabrication:1 N°poste: 20 Nom opération: droite
N°de fabrication:2 N°poste: 15 Nom opération: bas
N°de fabrication:2 N°poste: 25 Nom opération: haut
N°de fabrication:3 N°poste: 10 Nom opération: avant
N°de fabrication:3 N°poste: 15 Nom opération: bas
N°de fabrication:4 N°poste: 5 Nom opération: arrière

La base de données me recence toutes les opérations correspondant aux numéros de fabrication. Le numéro de poste correspont à l'avancement de la production.
Ce qu'il me faut c'est 3 colonnes avec le N° de fabrication, le N° de poste et le nom de l'opération mais avec un critère qui est que le numéro de poste sélectionné soit le plus grand pour un numéro de fabrication et qu'il me mette a coté le nom de l'opération correspondant.
C'est à dire pour l'exemple:


N°de fabrication:1 N°poste: 20 Nom opération: droite
N°de fabrication:2 N°poste: 25 Nom opération: haut
N°de fabrication:3 N°poste: 15 Nom opération: bas
N°de fabrication:4 N°poste: 5 Nom opération: arrière

Mais le souci c'est que mon programme ne veut pas que je fasse juste le max(numéro de poste) group by (numéro de fabrication). Il me met à la place (group by (numéro de fabrication; nom opération)
0
feez > Nico0044
23 mai 2008 à 11:43
il faut que nomoperation soit dans le group by. il s'affichera et tu auras ce que tu veux.
essaye, tu verras, ca marche forcément!^^
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 12:07
Je te recommande de créer deux tables :
1. tblFabrication : avec numFabrication et numPoste
2. tblPostes : avec numPoste et nomOperation

create table tblPostes (numPoste INT, nomOperation VARCHAR(50));

Dans la table tblPostes, tu n'as qu'une seule fois chaque poste :
15,'bas'
25,'haut'
10,'avant'
5,'arrière'

Dans la table tblFabrication, tu ne répètes pas le nomOperation que tu vas chercher au moment du SELECT par :
SELECT F.numFabrication,F.numPoste,P.nomOperation
   FROM tblFabrication AS F, tblPostes AS P
   WHERE F.numPoste=P.numPoste;

Ceci donne le détail des opérations. Pour avoir ce que tu veux :
SELECT F.numFabrication,Max( F.numPoste),P.nomOperation
   FROM tblOperations AS F, tblPostes AS P
   WHERE F.numPoste=P.numPoste
   GROUP BY F.numFabrication;


Ceci est une organisation qui tire parti de l'organisation dite "base de données relationnelle"
0