如何编写第6个SQL查询计算5个已有查询结果的平均值?
嘿,这个需求很好实现,核心思路就是把每个独立的单值查询当成数据源,然后聚合计算平均值就行。我先从你给的两个查询的例子说起,再扩展到5个查询的场景。
针对你给出的两个查询示例(str1和str2)
方法1:用UNION ALL合并成多行后计算AVG
这种方法的好处是如果某个子查询返回NULL(比如没有匹配数据),AVG()函数会自动忽略这个值,容错性更高:
SELECT AVG(result) AS average_value FROM ( -- 第一个查询的结果 SELECT total AS result FROM endpoints UNION ALL -- 第二个查询的结果 SELECT total AS result FROM data ) AS subquery_results
方法2:直接计算两个值的平均值
如果能确保两个查询一定返回非NULL的单个值,可以直接用算术运算,写法更简洁:
SELECT ( (SELECT total FROM endpoints) + (SELECT total FROM data) ) / 2 AS average_value
要是担心某个查询可能返回NULL,可以用COALESCE()把NULL转成0(或者你业务需要的默认值):
SELECT ( COALESCE((SELECT total FROM endpoints), 0) + COALESCE((SELECT total FROM data), 0) ) / 2 AS average_value
扩展到5个查询的场景
思路和两个查询完全一致,只是多添加几个子查询即可:
方法1:UNION ALL + AVG(推荐,容错性高)
SELECT AVG(result) AS average_value FROM ( SELECT your_value AS result FROM query_1_table -- 替换成你的第一个查询 UNION ALL SELECT your_value AS result FROM query_2_table -- 第二个查询 UNION ALL SELECT your_value AS result FROM query_3_table -- 第三个查询 UNION ALL SELECT your_value AS result FROM query_4_table -- 第四个查询 UNION ALL SELECT your_value AS result FROM query_5_table -- 第五个查询 ) AS all_subquery_results
方法2:直接算术运算(适合确定所有查询都有结果的场景)
SELECT ( (SELECT value FROM query_1) + (SELECT value FROM query_2) + (SELECT value FROM query_3) + (SELECT value FROM query_4) + (SELECT value FROM query_5) ) / 5 AS average_value
同样,要处理NULL的话,给每个子查询套上COALESCE()就行。
关键注意事项
- 每个子查询必须确保只返回单个数值,如果某个查询返回多行,会直接报错;
- 根据你的业务需求选择处理
NULL的方式:是忽略(用AVG的方式)还是替换成默认值(用COALESCE); - 如果你的查询不是简单的
SELECT total FROM table,而是更复杂的聚合查询(比如SELECT COUNT(*) FROM ...),直接把整个查询放到子查询里就行,只要它返回单个值。
内容的提问来源于stack exchange,提问作者Sahil Tanwar
相关产品推荐
相关产品推荐

