首页 > 解决方案 > 数值除法格式输出题

问题描述

我的结果如下:

| ad_id | ctr   |
+-------+-------+
| 1     | 66.67 |
| 3     | 50.00 |
| 2     | 33.33 |
| 5     | 0.00  |
+-------+-------+

我的查询如下

select ad_id, coalesce(Round(total_clicks / (total_clicks + total_views) * 100,2),0) as ctr
from (
    
    select ad_id, 
           sum(case when action = 'Clicked' then 1 else 0 end) as total_clicks,
           sum(case when action = 'Viewed' then 1 else 0 end) as total_views
    from ads
    group by 1) a
    group by 1
    order by 2 desc, 1 asc

我知道有时像这样计算时需要转换为十进制或浮点数,就好像我在结果输出中的第一行是 66.67,在我的查询中的计算中它实际上是 .06666667 但不应该计算为 0,因为我没有转换为数字还是小数?我只有* 100,但即便如此,那不应该只给我66吗?还是圆形无论如何都转换为十进制?就像我通常在 sql 中所知道的那样,当您除以需要强制转换为十进制以确保输出具有小数时,您会感到困惑吗?谢谢!

标签: mysqlsql

解决方案


我建议您将查询编写为:

select ad_id, avg( action = 'Clicked' ) as ctr
from ads
where action in ('Clicked', 'Viewed')
group by 1;

MySQL 将布尔值视为数字上下文中的数字——分别1为真和0假。平均值适用于十进制数,因此在这种情况下无需担心整数平均值。


推荐阅读