Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Tsql 如何在Sql Server中平均3个值?_Tsql_Sql Server 2008_Average - Fatal编程技术网

Tsql 如何在Sql Server中平均3个值?

Tsql 如何在Sql Server中平均3个值?,tsql,sql-server-2008,average,Tsql,Sql Server 2008,Average,我有三个变量:- @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 干

我有三个变量:-

@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
干杯

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

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

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

嗯,我从没想过。我想这可能是AVG(…)函数的一些技巧。。。brb:)很好。工作:)不确定为什么你有=>(0+)。。。那0+就是。。冗余???晚了,但谷歌把我带到了这里。快速评论:CTE应该是UNION ALL,因为UNION消除了重复的行,在这种情况下,这相当于消除n-1个相等的值。如果@A=@B,那么你得到的是@A和@C的平均值,而不是@A、@B和@C。你确定吗?不是A+B+C/0。。发生。。如果所有的数据都是零?那将是一个除以零的数??对在这种情况下,它将除以1。我假设您对CTE(sql-server-2008问题)没有意见,所以我认为在这里使用它们是更好的选择:)
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