COUNT两倍于同一列

时间:2017-04-24 20:16:52

标签: mysql count logic percentage

我试图用不同的条件计算两次相同的列,最后使计算知道一定的百分比。

该列填充了1到10之间的几个数字,我想知道数字优于6的行的百分比。

我有想法检索数字:

SELECT number, Sum(number> 6) as number_sup_to_6 FROM table;

但是我想在检索那些以计算总数为6的数字百分比之后:((n> 6)/ n)* 100

然后我从之前的帖子中获取灵感来制作计算:

concat(round(( number_sup_to_6 /number* 100 ),2),'%') AS percentage
问题是,我不知道如何将这2个sql放在一起,有人可以帮助我如何理解如何将它们组合在一起?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

使用CASE语句

SELECT number, (number_sup_to_6/total_count)*100 AS percentage
FROM
(SELECT number, 
COUNT(CASE WHEN number > 6 THEN number ELSE NULL END) AS number_sup_to_6, 
COUNT(number) AS total_count FROM table_name 
GROUP BY number) AS a

答案 1 :(得分:1)

我建议条件聚合的替代方法:

SELECT SUM(t.number>6) / COUNT(t.number) AS ratio_num_sup_to_six
  FROM mytable t

请注意,此计算数字值大于6的行,计算具有非空值数字的行。这相当于返回的结果:

SELECT COUNT(IF(t.number>6,1,NULL)) / COUNT(t.number) AS ratio_num_sup_to_six
  FROM mytable t

我们还可以用更符合ANSI标准的等价物来表达:

SELECT COUNT(CASE WHEN t.number>6 THEN 1 ELSE NULL END) 
     / COUNT(t.number) AS ratio_num_sup_to_six
  FROM mytable t

如果目标是从number列中存储的值(值的SUM而不是行的COUNT)中获取总计,则类似这样的事情:

SELECT SUM(IF(t.number>6,t.number,NULL)) / SUM(t.number) AS ratio_tot_sup_to_six
  FROM mytable t

<强>格式

如果我们绝对需要在SQL查询本身(而不是客户端)中将比例转换为显示百分比,那么我们可以将上面的任何表达式包装在:

  CONCAT(ROUND(( expr )*100,2),'%')

例如:

SELECT CONCAT(ROUND(( SUM(t.number>6) / COUNT(t.number) )*100,2),'%') AS pct_num_sup_to_six
  FROM mytable t

请注意,ROUND函数的返回保证在小数点后包含两位数。也就是说,我们可能得到22.2%&#39;或者&#39; 50%&#39;返回。

如果在小数点后面返回两位数字(显示)很重要,我们可以使用MySQL FORMAT函数https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_format

这将保证返回两个(或多个我们想要的)十进制数字,即使数字为零。所以我们可以得到50.00&#39;返回而不是&#39; 50。 (打扰FORMAT的另一个原因是,它还将包含值为&gt; = 1000的逗号分隔符。)

<强>性能

这种方法只需单次通过表,比其他解决方案更有效,这些解决方案会产生实现内联视图(派生表)的额外开销。

答案 2 :(得分:0)

试试这个:

SELECT CONCAT(ROUND(( a.sum / b.sum * 100 ), 2), '%') AS percentage
FROM 
(SELECT SUM(number) AS sum FROM table WHERE number > 6) a,
(SELECT SUM(number) AS sum FROM table) b