cs_jul21
Messages postés10Date d'inscriptionmardi 24 mars 2009StatutMembreDernière intervention21 septembre 2009
-
24 mars 2009 à 12:02
cs_jul21
Messages postés10Date d'inscriptionmardi 24 mars 2009StatutMembreDernière intervention21 septembre 2009
-
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.
A voir également:
Chaque expression group by doit contenir au moins une colonne qui n'est pas une référence externe.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20112 24 mars 2009 à 14:42
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)
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20112 24 mars 2009 à 16:12
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
cs_jul21
Messages postés10Date d'inscriptionmardi 24 mars 2009StatutMembreDernière intervention21 septembre 2009 24 mars 2009 à 14:51
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.