SQL调优:两列之和的划分

时间:2015-12-29 19:17:02

标签: mysql sql sql-server database

我想做这样的事情:

SELECT SUM(COL1) / SUM(COL2) FROM table_name

我的问题:

  1. 错误处理。如果SUM(COL2)为0,那么最多将返回什么 数据库实现?在这种情况下如何返回0?
  2. 性能调整。是通常保证这两个SUM() 将在一个循环中计算,而不是通过所有 记录计算SUM(COL1),然后再次通过所有内容 计算SUM(COL2)?如果不能保证,如何改进 这种划分可以通过数据库引擎在一个循环中完成吗?
  3. 您可以根据您熟悉的数据库引擎回答此问题。

    (我已经对问题1有了很多优秀的答案,但似乎没有人知道问题2的答案。)

4 个答案:

答案 0 :(得分:1)

以下是问题1的SQL Server解决方案。

SELECT COALESCE((SUM(COL1) / NULLIF(SUM(COL2),0)),0) FROM table_name

我不知道问题2的答案,但我可以说,我从来没有看到任何其他替代方式,您已经通过这种方式编写了查询,我可以安全地假设这是查询查询的最有效方式。

答案 1 :(得分:1)

SQL:

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

如果column2的总和不大于0(包括空值),则给出0值。

修改

这假设您在column2中不会有负值。如果可能出现负值,您可能希望使用:

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

这将对所有非0 NUMBERS 进行计算。但是,对于 0 NULL 值,它只会返回0.

答案 2 :(得分:0)

如果MySQL问题1是答案:

select CASE WHEN IFNULL(sum(COL2),0) <> 0 THEN (IFNULL(sum(COL1),0) / sum(COL2) ) ELSE 0 END  from table_name ;     

答案 3 :(得分:0)

您也可以简单地使用三元运算符。其他程序员很容易理解,只是阅读。几乎每个数据库引擎都有支持。

SELECT IF(SUM(COL2)= 0,SUM(COL1)/ SUM(COL2), - 1)FROM table_name