我的结果是:
| 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中所知道的那样,当你进行除法时,你需要转换为十进制以确保输出有十进制?谢谢
在MySQL中,/
运算符总是执行双精度或小数运算。如果您想要整数除法,请使用DIV
SELECT 1 / 2 => 0.5
SELECT 1 DIV 2 => 0
我建议您将查询写成:
select ad_id, avg( action = 'Clicked' ) as ctr
from ads
where action in ('Clicked', 'Viewed')
group by 1;
MySQL将布尔值视为数字上下文中的数字——1
表示true,0
表示false。Average适用于十进制数,因此在这种情况下无需担心整数平均值。