2016-06-25 10 views
0

SQLクエリに問題があります。テーブルからそれを呼び出しましょうレポート:条件付きおよび条件なしの列からのSQLクエリによるグループまたは割合

すべてのレポートを名前列でグループ化したいと思います。

これらの名前のグループごとに、評価欄に移動して、評価が15回以下であった回数をカウントします。 BOBBOという名前のグループの1つで、これが10回起こったとしましょう。

評価を送信した回数(各名前グループの合計レコード数と同じ)も知りたいと思う。だから、名前のグループBOBBOを使って、彼は20の評価を持っているとしましょう。

したがって、条件の下で、グループBOBBOの時間の50%は、レーティングが15以下です。

私はこれらの記事を見ました - 私はまだこれをクラックするいくつかの問題を抱えています。

ActiveRecord::Base.connection.execute 
("SELECT COUNT(*) Matched, 
    (select COUNT(rating) from reports group by name) Total, 
    CAST(COUNT(*) AS FLOAT)/CAST((SELECT COUNT(*) FROM reports group by name) AS FLOAT)*100 Percentage from reports 
    where rating <= 15 order by Percentage") 


    ActiveRecord::Base.connection.execute 
("select name, sum(rating)/count(rating) as bad_rating 
from reports group by name having bad_rating <= 15") 

すべてのヘルプWO:

using-count-and-return-percentage-against-sum-of-records

getting-two-counts-and-then-dividing-them

getting-a-percentage-from-mysql-with-a-group-by-condition-and-precision

divide-two-counts-from-one-select

それらを読んだ後、私はこれらのようなクエリを試してみましたuldは非常に高く評価される!

SELECT [name], 
     SUM(CASE WHEN [rating] <= 15 THEN 1 ELSE 0 END)/Count(*) AS bad_rating 
FROM Reports 
GROUP BY [name] 

または@CLとして:

答えて

1

はフルカウントで割っ悪い評価のための条件付き集計を考えてみましょう。

SELECT [name], 
     SUM([rating] <= 15)/Count(*) AS bad_rating 
FROM Reports 
GROUP BY [name] 
+0

'sum(rating <15)'はより短い条件付き集計(論理式が合算されるところ)を指します。 –

+0

確かに。ありがとう@CL。 - あなたの提案を追加! – Parfait