首页 > 解决方案 > 如何按函数对一组结果进行数学函数(除法)

问题描述

我有一个 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

标签: sql

解决方案


有几种查询模式。

一种方法是条件聚合。如果条件为真,我们可以返回值 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

推荐阅读