Reqûete SQL qui fit de la résistance [Résolu]

cs_jul21 10 Messages postés mardi 24 mars 2009Date d'inscription 21 septembre 2009 Dernière intervention - 24 mars 2009 à 12:02 - Dernière réponse : cs_jul21 10 Messages postés mardi 24 mars 2009Date d'inscription 21 septembre 2009 Dernière intervention
- 25 mars 2009 à 14:32
Bonjour à tous !!

J'ai une requête qui me fait de la résistance, la voici :

Insert Into TOTO (DateHeure,Vmoyenne,NomMachine,Periode)
Select Current_Timestamp , Avg(TagValue), StationName,Cast('h' as char)
From TEtatMachine20iWhere TagName'VMOYENNE' and cast (TagTimeStamp <gras>as DateTime)<</gras>Current_Timestamp
and Cast(TagTimeStamp as DateTime)>=Cast(DateAdd(hour,-1,Current_Timestamp) as DateTime)

l'erreur est la suivante :

Msg 8120, Niveau 16, État 1, Ligne 25
La colonne 'TEtatMachine20i.StationName' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
Afficher la suite 

4 réponses

Répondre au sujet
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 24 mars 2009 à 14:42
+3
Utile
bonjour,

si tu utilise des fonctions d'agregat (moyenne en l'occurence), tu dois utiliser la clause GROUP BY pour indiquer sur quoi grouper

la apparement tu veux calculer la moyenne pour une machine et une periode données

essaie :

Insert Into TOTO (DateHeure,Vmoyenne,NomMachine,Periode)
Select Current_Timestamp , Avg(TagValue), StationName,Cast('h' as char)
From TEtatMachine20iWhere TagName'VMOYENNE' and cast (TagTimeStamp <gras>as DateTime)<</gras>Current_Timestamp
and Cast(TagTimeStamp as DateTime)>=Cast(DateAdd(hour,-1,Current_Timestamp) as DateTime)
GROUP BY StationName,Cast('h' as char)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
aieeeuuuuu 698 Messages postés jeudi 16 janvier 2003Date d'inscription 20 mai 2011 Dernière intervention - 24 mars 2009 à 16:12
+3
Utile
Arfff,
oui je suis allé un peu vite sur le group by, j'avais pas vu que le cast ne faisait pas référence a une colonne...

en fait tu lui demande de calculer une moyenne. il faut donc lui préciser sur quelle colonne tu regroupe pour faire ta moyenne. En gros, de plusieurs resultats (ici plusieurs machine du meme nom), il va retourner une seule ligne. la clause GROUP BY permet de préciser que tu regroupe toutes les machine du meme nom, et que tu fais la moyenne de la valeur TagValue, machine par machine....

quand tu utilise des fonctions d'agregat (somme, moyenne, max, min, ...) qui effectue un calcul sur plusieurs données, il faut bien que tu ait plusieurs données... :) la clause GROUP BY est donc obligatoire pout tous les champs spécifiés dans la clause SELECT, et pour lesquels tu n'utilise pas de fonction d'agregat

je ne sais pas si j'ai été clair.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de aieeeuuuuu
cs_jul21 10 Messages postés mardi 24 mars 2009Date d'inscription 21 septembre 2009 Dernière intervention - 24 mars 2009 à 14:51
0
Utile
Salut,

Merci pour ta réponse, j'ai fait le test et ça marche mais sans le Cast('h' as char) à la fin.

La requête devient donc :

Insert Into TOTO (DateHeure,Vmoyenne,NomMachine,Periode)
Select Current_Timestamp , Avg(TagValue), StationName,Cast('h' as char)
From TEtatMachine20iWhere TagName'VMOYENNE' and cast (TagTimeStamp <gras>as DateTime)<</gras>Current_Timestamp
and Cast(TagTimeStamp as DateTime)>=Cast(DateAdd(hour,-1,Current_Timestamp) as DateTime)
GROUP BY StationName

Si je laisse le Cast('h' as char) j'ai le message d'erreur suivant:
Msg 164, Niveau 15, État 1, Ligne 23
Chaque expression GROUP BY doit contenir au moins une colonne qui n'est pas une référence externe.

Je ne comprends pas tous, y compris le raison pour laquelle en mettant à la fin le GROUP BY StationName...cela fonctionne; Si tu pouvais me donner des explications supplémentaires je suis preneur.

Merci encore.
Commenter la réponse de cs_jul21
cs_jul21 10 Messages postés mardi 24 mars 2009Date d'inscription 21 septembre 2009 Dernière intervention - 25 mars 2009 à 14:32
0
Utile
Salut,

C'est ok, c'est clair.

Merci.
Commenter la réponse de cs_jul21

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.