Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL调优:两列之和之间的除法_Mysql_Sql_Sql Server_Database - Fatal编程技术网

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
我的问题是:

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



    (对于问题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数字进行计算。但是,对于0NULL值,它将只返回0。

    NULLIF(总和(COL2),0))
    在分母中?@vkp是的,如果分母为零,您将得到一个
    除以零的错误,因此我们在进行除法之前将零更改为NULL。如果分子为零,我们将正确地得到零,没有错误,因此无需处理。由于没有人回答我的问题2,我将接受这个答案,因为它更独立于特定的数据库引擎,并提供更好的可读性。谢谢各位。