2016-05-24 15 views
0

私は責任とコラボレーションのための学生の平均得点を得ようとしています。問題は、責任とコラボレーションのタスクを「音楽のコラボレーション」や「数学のコラボレーション」といったさまざまなものと呼ぶことができますが、それらの名前にはまだ「責任」または「コラボレーション」があります。したがって、以下のクエリを実行すると、コラボレーションに関連するタスクと責任タスクに対して複数の結果が得られます。私は責任のための平均と協力のための平均が必要です。助言がありますか?私はSQL Serverを持っています。SQLグループの平均

SELECT gradingscores.task AS task, 
     avg(Cast(gradingscores.score AS decimal) as averages 
FROM gradingscores 
WHERE isnumeric(gradingscores.score) = 1 
    AND task LIKE %responsibility% 
    OR task LIKE %collaboration% 

だから私の結果は次のようになります。数学3.5 責任nは英語3.0音楽 コラボレーションアートで3.5 コラボレーション音楽 責任4.0 責任

タスクの平均値2.5

私は希望結果は次のようになります。

タスク平均 責任4.0 コラボレーション3.5

グレーディングスコアもvarcharであり、数値以外のデータを割り引く数値に変換する必要があります。

+1

dbスキーマ、サンプルデータ、期待される結果を表示して、必要なものを確認してください。 [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

+0

**統計的なサンプリングを実行していない限り、float **を使用しないでください。 **あなたがこの問題を理解するまで、コンピューティングで常に小数点を使用してください**。浮動小数点数は、数字を表すために基数2の指数を使用する不正確なデータ型であるため、10進数を正確に表すことはできず、(例えば)5と期待される値が4.99999999として表示される問題が生じます。 – ErikE

答えて

0

私は、Selectステートメントからタスク名を削除し、責任とコラボレーションの等級について別々のクエリを実行する必要があることに気付きました。このようにして、責任またはコラボレーションを持つすべてのタスクが自動的にグループ化されます。

SELECT avg(Cast(gradingscores.score AS decimal) as averages 
FROM gradingscores 
WHERE isnumeric(gradingscores.score) = 1 
     AND task LIKE %responsibility% 
0

あなたは(13文字)RTRIMは、コ​​ラボレーションに余分なスペースを取り除くために、タスクの最初の14文字でグループにできるはずです

「どこが」それだけに起こっていることを確認しますコラボレーションまたは責任であるエントリを取得します。

SELECT RTRIM(LEFT(gradingscores.task, 14) AS task, 
     cast(avg(Cast(gradingscores.score AS decimal(10,1)) as decimal(10,1)) as averages 
FROM  gradingscores 
WHERE isnumeric(gradingscores.score) = 1 
    AND task LIKE 'responsibility%' 
    OR task LIKE 'collaboration%' 
GROUP BY RTRIM(LEFT(gradingscores.task, 14)