计算百分比的替代查询
Alternative query for calculating percentage
在 SQL 计算百分比的服务器中,我有如下函数:
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
之后直接使用
使用 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;
我使用@DmitrijKultasev 回答,但现在,我发现它有两个问题:
- 乘法结果溢出导致转换错误
- 性能问题;因为那个数学乘法及其转换。
所以我改成这样:
SELECT
CASE
WHEN total <> 0 AND part <> 0 THEN -- This will return 0 for Null values
part * 100 / total
ELSE
0
END AS percentage;
在 SQL 计算百分比的服务器中,我有如下函数:
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
之后直接使用
使用 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;
我使用@DmitrijKultasev 回答,但现在,我发现它有两个问题:
- 乘法结果溢出导致转换错误
- 性能问题;因为那个数学乘法及其转换。
所以我改成这样:
SELECT
CASE
WHEN total <> 0 AND part <> 0 THEN -- This will return 0 for Null values
part * 100 / total
ELSE
0
END AS percentage;