如何对UNION查询返回的两行count值执行除法运算?
解决SQL中两个计数结果的除法运算需求
嘿,我来帮你搞定把那两个count值做除法的需求!你的原查询返回了两行数据,分别是user='None'和user!='None'的记录数,我们可以直接优化查询,让它直接输出你想要的比例值,不用额外处理两行结果。
最简洁高效的实现方式
直接将两个计数查询作为子查询,然后进行除法运算,这样既清晰又避免了UNION的额外开销:
SELECT (SELECT COUNT(id) FROM listens WHERE user = 'None') * 1.0 / (SELECT COUNT(id) FROM listens WHERE user != 'None') AS ratio;
为什么要乘以1.0?
这是为了避免整数除法的截断问题——很多数据库(比如MySQL、PostgreSQL)在整数之间做除法时,会直接舍去小数部分只返回整数。乘以1.0会把整数转换为浮点数,确保得到精确的小数结果(比如你想要的0.3263092546)。
如果一定要基于原查询结构修改
要是你想保留原有的UNION子查询结构,也可以通过给行编号后取对应值来计算:
SELECT MAX(CASE WHEN rn = 1 THEN count ELSE 0 END) * 1.0 / MAX(CASE WHEN rn = 2 THEN count ELSE 0 END) AS ratio FROM ( SELECT count, ROW_NUMBER() OVER () AS rn FROM ( SELECT COUNT(id) AS count FROM listens WHERE user = 'None' UNION SELECT COUNT(id) AS count FROM listens WHERE user != 'None' ) AS details ) AS numbered_details;
这个方法先给UNION返回的两行数据编号,再通过MAX(CASE...)分别提取两个计数,最后做除法。不过相比第一种方法,它的可读性和效率都稍差一些,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

