Sql server 用于计算百分比的可选查询
在用于计算百分比的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) *
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)作为百分比
可直接用于选择
。