来自有条件和无条件列的 SQL 查询分组的比率或百分比

Posted

技术标签:

【中文标题】来自有条件和无条件列的 SQL 查询分组的比率或百分比【英文标题】:Ratio or Percentage from group by SQL query from column with condition and without condition 【发布时间】:2016-06-25 22:30:59 【问题描述】:

我在使用 SQL 查询时遇到了一些问题。从表中我们称其为报告:

我想按名称列对所有报告进行分组。

然后,对于这些名称组中的每一个,我想转到评级列并计算评级为 15 或更少的次数。假设其中一个名为 BOBBO 的组发生了 10 次。

我还想知道提交评分的次数(与每个名称组的记录总数相同)。因此,使用名称组 BOBBO 假设他有 20 个评分。

因此,在条件下,BOBBO 组 50% 的时间评分为 15 或更低。

我已经看过这些帖子——我仍然无法破解这个问题。

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

读完之后我尝试了这样的查询:

    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")

任何帮助将不胜感激!

【问题讨论】:

请指定表结构和您期望的输出 【参考方案1】:

考虑差评级除以完整计数的条件聚合:

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

或@CL。指出一个较短的条件聚合(逻辑表达式求和):

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

【讨论】:

sum(rating &lt; 15) 更短。

以上是关于来自有条件和无条件列的 SQL 查询分组的比率或百分比的主要内容,如果未能解决你的问题,请参考以下文章

SQL学习笔记 ----Mysql数据库的条件查询

大熊猫中分组的条件比率

sql多条件分组查询,求sql语句。

聚合函数和分组查询(有宝藏)

聚合函数和分组查询(有宝藏)

mysql根据分组和条件查询以后如何统计记录的条数