sql - 如何按函数对一组结果进行数学函数(除法)
问题描述
我有一个 6 位数字事件编号表;我正在尝试计算在特定时间段内发生的一个事件数(比如说 600189),并将其除以同一时间段内第二个事件数(比如说 600122)的计数。
下面的查询得到我的两个计数,但我想修改查询来进行计算(count of 600189 / count of 600122) * 100
:
select count (messageno)
from event
where timestamp > '2019-03-14' and timestamp < '2019-03-15' and
messageno in ('600122','600189')
group by messageno
解决方案
有几种查询模式。
一种方法是条件聚合。如果条件为真,我们可以返回值 1,否则返回 0,并将 1 和 0 与 SUM 聚合相加得到计数。考虑:
对于 MySQL,我们可以这样做:
SELECT SUM( IF(e.messageno='600122',1,0) ) AS cnt_600122
, SUM( IF(e.messageno='600189',1,0) ) AS cnt_600189
, ( 100.0
* SUM( IF(e.messageno='600122',1,0) )
/ SUM( IF(e.messageno='600189',1,0) )
) AS pct
FROM event e
WHERE e.timestamp > '2019-03-14'
AND e.timestamp < '2019-03-15'
AND e.messageno IN ('600122','600189')
更可移植的符合 ANSI 标准的等效等效项将适用于 Microsoft SQL Server 等:
SELECT SUM( CASE e.messageno WHEN '600122' THEN 1 ELSE 0 END ) AS cnt_600122
, SUM( CASE e.messageno WHEN '600189' THEN 1 ELSE 0 END ) AS cnt_600189
, ( 100.0
* SUM( CASE e.messageno WHEN '600122' THEN 1 ELSE 0 END )
/ SUM( CASE e.messageno WHEN '600122' THEN 1 ELSE 0 END )
) AS pct
FROM event e
WHERE e.timestamp > '2019-03-14'
AND e.timestamp < '2019-03-15'
AND e.messageno IN ('600122','600189')
其他方法是在内联视图中进行聚合,或在 SELECT 列表中使用子查询:
SELECT 100.0
* ( SELECT SUM(1)
FROM event e
WHERE e.timestamp > '2019-03-14'
AND e.timestamp < '2019-03-15'
AND e.messageno IN ('600122')
)
/ ( SELECT SUM(1)
FROM event e
WHERE e.timestamp > '2019-03-14'
AND e.timestamp < '2019-03-15'
AND e.messageno IN ('600189')
)
AS pct
推荐阅读
- android - 如何在不使用 Mainacitivity 的情况下先显示我的启动画面
- python - 从 Python Pandas DataFrame 获取列值和索引值
- python - 我无法理解元组中的这段代码
- go - 作为 golang 中的 gorilla 客户端,我如何连接到 golang 中的 3rd 方 ws 服务?还是不可能?
- flutter - Flutter appbundle 拆分
- amazon-web-services - 自动化 Amazon RDS postgresql 中的数据库后创建脚本或步骤
- netstat - 如何在 netstat 输出中仅 grep 特定端口号而不是该端口号的所有组合
- python - Tkinter 中的窗口分辨率
- flutter - 无法使用 Listview.Builder 和 ListTile 显示从 Firestore 下载的数据
- python - Discord.py如何删除服务器中的所有角色