计算百分比的替代查询

时间:2015-04-07 06:17:57

标签: sql-server percentage query-performance

在用于计算百分比的SQL Server中,我有一个如下函数:

CREATE FUNCTION [dbo].[fuGetPercentage] ( @part FLOAT, @total FLOAT )
RETURNS FLOAT 
AS
BEGIN   
    DECLARE @Result FLOAT = 0, @Cent FLOAT = 100;
    IF (isnull(@total, 0) != 0)
        SET @Result = isnull(@part, 0) * @Cent / @total;
    RETURN @Result
END

我不知道有没有更好的选择,相同的检查和更好的计算百分比如下:

SELECT (CASE ISNULL(total, 0) 
            WHEN 0 THEN 0 
            ELSE ISNULL(part, 0) * 100 / total 
        END) as percentage

我想在SELECT之后直接使用它。

2 个答案:

答案 0 :(得分:3)

使用ISNULL等功能存在一个问题。在这种情况下,查询不会使用索引。如果代码之美并不是首先,那么你可以做类似的事情:

SELECT
    CASE WHEN total * part <> 0 /* will check that both total and part are not null and != 0*/ 
           THEN part * 100 / total
         ELSE 0
    END AS percentage;

答案 1 :(得分:0)

我使用@DmitrijKultasev回答但现在,我发现它有两个问题:

  1. 由于乘法结果溢出而导致转换错误。
  2. 性能问题;因为那个数学乘以它的转换。
  3. 所以我把它改成了这个:

    SELECT
        CASE 
            WHEN total <> 0 AND part <> 0 THEN -- This will return 0 for Null values
                part * 100 / total
            ELSE 
                0
        END AS percentage;