mysql - 数值除法格式输出题
问题描述
我的结果如下:
| 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 中所知道的那样,当您除以需要强制转换为十进制以确保输出具有小数时,您会感到困惑吗?谢谢!
解决方案
我建议您将查询编写为:
select ad_id, avg( action = 'Clicked' ) as ctr
from ads
where action in ('Clicked', 'Viewed')
group by 1;
MySQL 将布尔值视为数字上下文中的数字——分别1
为真和0
假。平均值适用于十进制数,因此在这种情况下无需担心整数平均值。
推荐阅读
- php - Symfony 表单重定向到控制器而不是路由
- bash - 带有函数 / for 循环的 Bash Scipt
- php - S3 Flysystem 返回文件密钥,但 size 方法抛出“未找到”
- pywinauto - 让 pywinauto 在截屏前运行所有的 cmd 命令
- jquery - 现有 JS 的 Google Analytics 问题
- java - 如何使 REST API 安全
- node.js - 向不同端点发出请求时,Twitter 的速率限制如何发挥作用?
- python - Python:根据列中的最大长度向行中的元素添加空格时遇到问题
- ios - 在 UICollectionViewFlowLayout 子类中在哪里重新计算静态 itemSize?
- apache - Apache 因自分配 SSL 和 MAMP Pro 5 而失败