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