Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/03/2011, 14h08   #1
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Par défaut Requête avec un Having SUM avec une autre requête

Bonjour à tous,

C'est ma première question sur se forum, je suis développeur en VB.Net et PHP, avec base de données MySQL.

Actuellement en train de développer un planning en VB.net avec une base MySQL en liens avec l'ERP Divalto.

Je rencontre un soucis lors de la plannification des taches.

J'ai une table "opération" et une table "planning".

Dans la table opréation :
num --> num auto
nom_opération --> champs texte avec par exemple : "coupe au massicot"
temps_prévu --> chanmps double avec par exemple "5,50" soit 5h30


Dans la table planning :
num --> num auto
jour_plannifé --> champs date avec par exemple : "14/03/2011"
temp_plannifié --> champs double avec par exemple "2,00" soit 2 heures



Une opération qui s'apelle "essais" avec num 1, peut faire 50 heures soit plusieurs jour de planning.
Je peux avoir mis 7 heures lundi, 7 heures mardi ...

Dans une liste je veux affiché toutes les opérations où la somme est inférieur au total des taches plannifié.

Donc pas exemple dans que l'opération num 1 n'a pas plus ou égale à 50 heures elle doit apparemetre dans la liste.

j'ai déjà la requete qui group et faire la somme, mais je n'arrive pas a joindre la requete pour affiché les opérations.


Code :
1
2
3
4
SELECT Sum(planning.temps_plannifié) AS tps_plannifié
FROM planning
GROUP BY planning.num_opération, planning.num_opération
HAVING (Sum(planning.temps_plannifié))<>false;


Merci d'avance pour votre aide.

Edouard
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h33   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Quelque chose comme ceci : ?

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT 
	O.num, 
	O.nom_operation, 
	O.temps_prevu, 
	SUM(P.temps_plannifié) AS tps_plannifié
FROM planning P
INNER JOIN operation O 
	ON P.num_operation = O.num
GROUP BY 
	O.Num, 
	O.nom_operation, 
	O.temps_prevu
HAVING SUM(P.temps_plannifié)< O.temps_prevu
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h00   #3
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Bonjour

Cela doit être bon mais je n'arrive pas à l'incorporer dans ma requête, j'avais pas tout mis pour simplifié.


La voici :

Code :
1
2
3
SELECT SUM(planning.temps_plannifié) AS tps_plannifié,ordre_fabrication.date_départ, opération.num AS numopération, liste_machine.num, liste_machine.nom_machine, opération.num_of, ordre_fabrication.référence, ordre_fabrication.désignation, ordre_fabrication.quantité_à_faire, opération.temps_prévu
FROM ((liste_machine INNER JOIN (liste_opération INNER JOIN opération ON liste_opération.num = opération.num_opération) ON liste_machine.num = liste_opération.num_machine) INNER JOIN ordre_fabrication ON opération.num_of = ordre_fabrication.num) INNER JOIN  planning ON planning.num_opération = opération.num GROUP BY planning.num_opération HAVING SUM(planning.temps_plannifié) < opération.temps_prévu
WHERE liste_machine.num=15
J'ai une erreur sur la fin.

Edouard
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h20   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

1/ indentez votre requete
2/ enlevez les parenthéses inutiles

Vous vous rendrez alors tout de suite compte que vous avez mis le where après le group by, having,... :

Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT ...
FROM ...
INNER JOIN ...
    ON
INNER JOIN ...
   ON ...
WHERE ...
GROUP BY ...
HAVING ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h34   #5
Futur Membre du Club
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 15
Points : 15
Envoyer un message via Yahoo à dramanebox Envoyer un message via Skype™ à dramanebox
Par défaut Un coup de pouce !

Salut,
Tu dois pouvoir t'en sortir avec sa , si tout va bien.
Donc à toi de voir_

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
SELECT SUM(planning.temps_plannifié) AS tps_plannifié,
  ordre_fabrication.date_départ,
  opération.num AS numopération,
  liste_machine.num,
  liste_machine.nom_machine,
  opération.num_of,
  ordre_fabrication.référence,
  ordre_fabrication.désignation,
  ordre_fabrication.quantité_à_faire,
  opération.temps_prévu
FROM liste_machine
INNER JOIN liste_opération
ON (liste_opération.num = opération.num_opération)
INNER JOIN opération
ON (liste_machine.num = liste_opération.num_machine)
INNER JOIN ordre_fabrication
ON (opération.num_of = ordre_fabrication.num)
INNER JOIN planning
ON (planning.num_opération = opération.num)
WHERE liste_machine.num    =15
GROUP BY planning.num_opération
HAVING SUM(planning.temps_plannifié) < opération.temps_prévu
Bonne chance
dramanebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h17   #6
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Je vous remercie pour l'aide que vous m'apportez, mais je n'arrive pas a m'en sortir.

Cela ne veut pas passer.
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h22   #7
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT Sum(planning.temps_plannifié) AS SommeDetemps_plannifié, ordre_fabrication.date_départ, opération.num AS numopération, liste_machine.num, liste_machine.nom_machine, opération.num_of, ordre_fabrication.référence, ordre_fabrication.désignation, ordre_fabrication.quantité_à_faire, opération.temps_prévu
FROM liste_machine 
INNER JOIN liste_opération 
ON liste_machine.num = liste_opération.num_machine 
INNER JOIN opération 
ON liste_opération.num = opération.num_opération
INNER JOIN ordre_fabrication 
ON opération.num_of = ordre_fabrication.num
LEFT JOIN planning ON opération.num = planning.num_opération
WHERE liste_machine.num=15
GROUP BY planning.num_opération
HAVING Sum(planning.temps_plannifié<[opération].[temps_prévu]


Voici la dernière version de la requête mais cela ne passe pas.
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h45   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par robinwood01 Voir le message
Voici la dernière version de la requête mais cela ne passe pas.
En hauteur ou en largeur ?

A moins que vous ne parliez d'un message d'erreur que vous a renvoyé le SGBDR, auquel cas il serait utile de nous en faire part...

NB, s'il vous parle d'une "syntaxe incorrecte", fermez la parenthèse que vous avez ouverte pour le SUM...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 11h41   #9
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Désolé, je vais être plus clair.

Voici l'erreur SQL :

-2147217900 - [MySQL][ODBC 5.1 Driver][mysqld-5.1.40-community]

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') GROUP BY planning.num_opération HAVING(SUM(planning.temps_plannifié) < opér' at line 1



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT SUM(planning.temps_plannifié) AS tps_plannifié,
 ordre_fabrication.date_départ,
 opération.num AS numopération, 
 liste_machine.num,
 liste_machine.nom_machine,
 opération.num_of,
 ordre_fabrication.référence,
 ordre_fabrication.désignation,
 ordre_fabrication.quantité_à_faire,
 opération.temps_prévu 
FROM(liste_machine) INNER JOIN liste_opération 
       ON (liste_machine.num=liste_opération.num_machine) INNER JOIN opération 
            ON (liste_opération.num = opération.num_opération) INNER JOIN ordre_fabrication 
                ON (opération.num_of = ordre_fabrication.num) LEFT JOIN planning 
                    ON (planning.num_opération = opération.num) 
WHERE liste_machine.num = 12) 
GROUP BY planning.num_opération 
HAVING(SUM(planning.temps_plannifié) < opération.temps_prévu) 
ORDER BY ordre_fabrication.num
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 11h54   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
toutes ces parenthèses sont inutiles
et vous en fermez une ... que vous n'avez pas ouverte :
Citation:
WHERE liste_machine.num = 12)
essayez ceci (je n'ai pas vérifié la requête en elle-même, juste indenté et vérifié les parenthèses):

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
SELECT 
	SUM(planning.temps_plannifié) AS tps_plannifié, 
	ordre_fabrication.date_départ,
	opération.num AS numopération, 
	liste_machine.num, 
	liste_machine.nom_machine,
	opération.num_of,
	ordre_fabrication.référence, 
	ordre_fabrication.désignation,
	ordre_fabrication.quantité_à_faire,
	opération.temps_prévu 
FROM liste_machine
INNER JOIN liste_opération 
	ON liste_machine.num=liste_opération.num_machine 
INNER JOIN opération 
	ON liste_opération.num = opération.num_opération
INNER JOIN ordre_fabrication 
	ON opération.num_of = ordre_fabrication.num
LEFT JOIN planning 
	ON planning.num_opération = opération.num 
WHERE liste_machine.num = 12
GROUP BY planning.num_opération 
HAVING SUM(planning.temps_plannifié) < opération.temps_prévu
ORDER BY ordre_fabrication.num
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 12h18   #11
Invité de passage
 
Homme Edouard
Développeur .NET
Inscription : mars 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Edouard
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : mars 2011
Messages : 6
Points : 0
Points : 0
Plus de problème de requête dans VB.Net par contre dans Access avec une liaison de table, ODBC donne une erreur (Erreur de syntaxe), dans VB.net le résultat souhaité n'est pas là :-( En fait il n'y a aucun donnée affichée.


Quand j'enlève cela :

Code :
1
2
3
4
 
"GROUP BY planning.num_opération  " & _
"        HAVING(SUM(planning.temps_plannifié) < opération.temps_prévu) " & _
"ORDER BY ordre_fabrication.num
J'ai des résultats sauf que je les ai tous, mais je veux retirer ceux qui sont égal ou supérieur en temps planifié de la table planning par rapport au temps prévu de la table opération.

Le group by peut être mal fait ?
robinwood01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 13h24   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par robinwood01 Voir le message

Le group by peut être mal fait ?
Pour MySQL il me semble que non, mais pour SQL, c'est une certitude.

Toutes vos colonnes qui n'entrent pas dans des fonctions d’agrégat devraient faire partie du group by !

ajoutez les !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 13h26   #13
Modérateur
 
Avatar de Chtulus
 
Homme Cédric
Cherche à comprendre
Inscription : avril 2008
Messages : 2 263
Détails du profil
Informations personnelles :
Nom : Homme Cédric
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Cherche à comprendre

Informations forums :
Inscription : avril 2008
Messages : 2 263
Points : 4 421
Points : 4 421
Envoyer un message via MSN à Chtulus Envoyer un message via Skype™ à Chtulus
Bonjour,

Pour infos (Et on recommence.....) :


Toutes les colonnes du SELECT non agrégées doivent faire parties du GROUP BY !!!!




[Mince me suis fait eu, et là je peux dire aieeeuuuuu ]
__________________
- De quelque manière qu'on s'y prenne on s'y prend toujours mal -
-Sigmund Freud-

Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
Tous les cours Office

Chtulus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h05.


 
 
 
 
Partenaires

Hébergement Web