Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Sql server 用于计算百分比的可选查询_Sql Server_Percentage_Query Performance - Fatal编程技术网

Sql server 用于计算百分比的可选查询

Sql server 用于计算百分比的可选查询,sql-server,percentage,query-performance,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) *

在用于计算百分比的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
我想知道是否有更好的替代方案,使用相同的支票和更好的计算百分比,如下所示:

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

我想在像上面那样选择
后直接使用它。

使用
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;
选择
当total*part 0/*将检查total和part是否都不为空且!=0*/ 
然后部分*100/总计
其他0
以百分比结束;

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

  • 由于乘法结果溢出,转换时出错
  • 性能问题;因为数学乘法和它的转换
  • 所以我把它改为:

    SELECT
        CASE 
            WHEN total <> 0 AND part <> 0 THEN -- This will return 0 for Null values
                part * 100 / total
            ELSE 
                0
        END AS percentage;
    
    选择
    案例
    当总数为0且部分为0时,则--这将为空值返回0
    第*100部分/总计
    其他的
    0
    以百分比结束;
    
    选择中,第二个逻辑似乎足够好了。你为什么要使用
    FLOAT
    而不是
    NUMERIC/DECIMAL
    ?@ughai没有。但是我不想要一个像
    SELECT
    这样的简单查询的函数。你的逻辑
    SELECT(当0为0时,case为null(total,0),然后其他0为null(part,0)*100/total end)作为百分比
    可直接用于
    选择