2

我有三个变量:-

@ScoreA DECIMAL(10,7)
@ScoreB DECIMAL(10,7)
@ScoreC DECIMAL(10,7)
@FinalScore DECIMAL(10, 7)

我希望得到三个分数的平均值。但是 1、2 或所有 3 个值可能为零。

例如。场景:

  • A=1.4,B=3.5,C=5.0;最终分数 = 3.3
  • A=0.0,B=0.0,C=0.0;最终分数 = 0.0
  • A=1.1,B=0.0,C=0.0;最终分数 = 1.1
  • A=0.0,B=2.0,C=4.8;最终分数 = 3.4

干杯!

4

3 回答 3

1
IF @A > 0 OR @B > 0 OR @C > 0
    SELECT ((@A + @B + @C) / 
        (0 + 
        CASE WHEN @A = 0 THEN 0 ELSE 1 END + 
        CASE WHEN @B = 0 THEN 0 ELSE 1 END + 
        CASE WHEN @C = 0 THEN 0 ELSE 1 END ))
ELSE
    SELECT 0.0

编辑

修改后的查询现在可以处理除以零的情况。

编辑2

这是使用公用表表达式的“AVG(..) 函数的技巧”:)

WITH T(I) AS (SELECT @A UNION SELECT @B UNION SELECT @C)
SELECT AVG(I) FROM T
WHERE I > 0
于 2009-08-21T06:57:09.607 回答
1
SELECT ((@A + @B + @C) / 
        (CASE WHEN (@A = 0.0 AND @B = 0.0 AND @C = 0.0) THEN 1 ELSE 0 END 
        + CASE WHEN @A = 0 THEN 0 ELSE 1 END 
        + CASE WHEN @B = 0 THEN 0 ELSE 1 END  
        + CASE WHEN @C = 0 THEN 0 ELSE 1 END 
        )
      )
于 2009-08-21T07:11:05.650 回答
0

对我来说,这更容易阅读和理解:

DECLARE
    @ScoreA DECIMAL(10,7),
    @ScoreB DECIMAL(10,7),
    @ScoreC DECIMAL(10,7),
    @FinalScore DECIMAL(10, 7)

SET @ScoreA = 1.4
SET @ScoreB = 3.5
SET @ScoreC = 5.0

DECLARE 
    @AVG TABLE (value DECIMAL(10,7))

INSERT INTO @AVG
    SELECT @ScoreA WHERE @ScoreA > 0
    UNION
    SELECT @ScoreB WHERE @ScoreB > 0
    UNION
    SELECT @ScoreC WHERE @ScoreC > 0

SELECT COALESCE(AVG(value), 0) FROM @AVG
于 2009-08-21T08:21:47.567 回答