如何将两条SQL查询语句执行除法运算?
实现两个SQL查询结果的除法运算
没问题,我来帮你搞定这个需求——把两个查询的结果做除法,得到符合value=0的记录在总符合条件记录中的占比对吧?这里有两种高效的实现方式,你可以根据自己的数据库和场景选择:
方式一:使用子查询直接除法
这种方式逻辑直观,就是把两个查询作为子查询放在同一个SELECT语句里做除法:
SELECT -- 分子:value=0的符合条件记录数 (SELECT COUNT(*) FROM jmeter WHERE "project" = 'testmatrix' AND "suite" = 'apitest' AND "build"='132' AND "status" = 'ok' AND "page" != 'all' AND "metric" = 'count' AND "value"=0)::FLOAT / -- 分母:所有符合条件的记录数 (SELECT COUNT(*) FROM jmeter WHERE "project" = 'testmatrix' AND "suite" = 'apitest' AND "build"='132' AND "status" = 'ok' AND "page" != 'all' AND "metric" = 'count') AS value_zero_ratio;
这里用::FLOAT把整数转成浮点型,是为了避免数据库的整数除法取整问题(比如5/2如果是整数除法会得到2,转成浮点后会得到2.5)。如果需要更高精度,也可以用::DECIMAL(10,2)这类格式。
方式二:使用条件聚合(更高效)
这种方式只需要扫描一次表,性能比两次子查询更好,适合数据量较大的场景:
SELECT -- 统计value=0的记录数,转成浮点型 SUM(CASE WHEN "value" = 0 THEN 1 ELSE 0 END)::FLOAT / -- 统计所有符合条件的记录数 COUNT(*) AS value_zero_ratio FROM jmeter WHERE "project" = 'testmatrix' AND "suite" = 'apitest' AND "build"='132' AND "status" = 'ok' AND "page" != 'all' AND "metric" = 'count';
逻辑很简单:SUM(CASE...)会把每个value=0的记录算1,其他算0,加起来就是符合条件的数量;COUNT(*)是总数量,两者相除就是你要的比率。
如果你用的数据库支持COUNT(CASE...)的写法,还可以简化成:
SELECT COUNT(CASE WHEN "value" = 0 THEN 1 END)::FLOAT / COUNT(*) AS value_zero_ratio FROM jmeter WHERE "project" = 'testmatrix' AND "suite" = 'apitest' AND "build"='132' AND "status" = 'ok' AND "page" != 'all' AND "metric" = 'count';
因为COUNT会自动忽略NULL值,当value≠0时CASE返回NULL,不会被统计进去,这样也能得到正确的数量。
内容的提问来源于stack exchange,提问作者Srikanta
相关产品推荐
相关产品推荐

