Mysql SQL调优:两列之和之间的除法
我想这样做:Mysql SQL调优:两列之和之间的除法,mysql,sql,sql-server,database,Mysql,Sql,Sql Server,Database,我想这样做: SELECT SUM(COL1) / SUM(COL2) FROM table_name 我的问题是: 错误处理。如果SUM(COL2)为0,那么大多数情况下返回什么 数据库实现?在这种情况下,如何返回0 性能调整。是否通常保证这两个总和() 将在单个循环中计算,而不是遍历所有 记录以计算总和(COL1),然后再次遍历所有内容 计算和(COL2)?如果不能保证,如何改进 数据库引擎是否能够在单个循环中完成此划分 您可以根据您熟悉的数据库引擎回答此问题。 (对于问题1,我已经得到
SELECT SUM(COL1) / SUM(COL2) FROM table_name
我的问题是:
(对于问题1,我已经得到了很多很好的答案,但似乎没有人知道问题2的答案。)下面是问题1的SQL Server解决方案
SELECT COALESCE((SUM(COL1) / NULLIF(SUM(COL2),0)),0) FROM table_name
我不知道问题2的答案,但是我可以说,我从来没有见过任何其他方法可以替代您选择的编写查询的方法,我发现可以安全地假设这是编写查询的最有效的方法。如果是问题1的答案:
select CASE WHEN IFNULL(sum(COL2),0) <> 0 THEN (IFNULL(sum(COL1),0) / sum(COL2) ) ELSE 0 END from table_name ;
选择IFNULL(sum(COL2),0)0时的大小写,然后(IFNULL(sum(COL1),0)/sum(COL2))否则0从表_name结束;
您也可以简单地使用三元运算符。很容易被其他编码人员理解,也很容易阅读。而且几乎每个db引擎都有支持
从表名称中选择IF(SUM(COL2)=0,SUM(COL1)/SUM(COL2),-1):
DECLARE @Table TABLE (column1 INT, column2 INT)
INSERT INTO @Table
VALUES
(0, 0)
SELECT CASE WHEN SUM(Column2) > 0
THEN
SUM(column1) / SUM(column2)
ELSE 0
END AS [Sum Division]
FROM @Table
如果第2列的和不大于0(包括空值),则将给出0值
编辑
这假设第2列中没有负值。如果可能出现负值,则您希望使用:
SELECT CASE WHEN SUM(Column2) IS NOT NULL AND SUM(Column2) <> 0
THEN
SUM(column1) / SUM(column2)
ELSE 0
END AS [Sum Division]
FROM @Table
选择SUM(Column2)不为NULL且SUM(Column2)为0时的大小写
然后
总和(第1列)/总和(第2列)
其他0
结束为[总和除法]
来自@Table
这将对所有非0数字进行计算。但是,对于0或NULL值,它将只返回0。
NULLIF(总和(COL2),0))
在分母中?@vkp是的,如果分母为零,您将得到一个除以零的错误,因此我们在进行除法之前将零更改为NULL。如果分子为零,我们将正确地得到零,没有错误,因此无需处理。由于没有人回答我的问题2,我将接受这个答案,因为它更独立于特定的数据库引擎,并提供更好的可读性。谢谢各位。