我试图用不同的条件计算两次相同的列,最后使计算知道一定的百分比。
该列填充了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放在一起,有人可以帮助我如何理解如何将它们组合在一起?
感谢您的帮助。
答案 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