Sql 如何找到具有不同特定权重的多个列的平均值?
我需要计算mssql中Sql 如何找到具有不同特定权重的多个列的平均值?,sql,sql-server,sum,average,weighted-average,Sql,Sql Server,Sum,Average,Weighted Average,我需要计算mssql中值A、值B和值C的平均值。 我的问题是,我需要的所有信息都在一行中 每个值都有自己的权重: (sum of values * weight) / (sum weight): 每一列都可以为空。如果有值但没有权重,则权重为100, 如果有一个权重而没有值,那么当然不考虑具体值 e、 g 第1栏: (2*100+1*80)/(100+80)= 2.55 ≈ 2.6 第二栏: (1*100+2*80)/(100+80) 我走了这么远,得到了没有权重的平均值 selec
值A
、值B
和值C
的平均值。我的问题是,我需要的所有信息都在一行中 每个值都有自己的权重:
(sum of values * weight) / (sum weight):
每一列都可以为空。如果有值但没有权重,则权重为100,如果有一个权重而没有值,那么当然不考虑具体值 e、 g 第1栏:
(2*100+1*80)/(100+80)= 2.55 ≈ 2.6
第二栏:
(1*100+2*80)/(100+80)
我走了这么远,得到了没有权重的平均值
select ID, VALUE_A, VALUE_B, VALUE_C, Weight_A, Weight_B, Weight_C,
(SELECT AVG(Cast(c as decimal(18,1)))
FROM (VALUES(VALUE_A),
(VALUE_B),
(VALUE_C)) T (c)) AS [Average]
FROM table
第二次尝试是选择值之和乘以它们的权重,然后除以它们的权重之和。缺少权重之和。不知道如何添加它
select *,
(SELECT SUM(Cast(c as decimal(18,1)))
FROM (VALUES(VALUE_A* ISNULL(Weight_A,100)),
(VALUE_B* ISNULL(Weight_B,100)),
(VALUE_C* ISNULL(Weight_C,100))
) T (c)) AS [Average]
FROM table
这就是你要找的吗
SELECT SUM(val * COALESCE(w, 100)) / SUM(w) as weighted_average,
SUM(val * COALESCE(w, 100)) as weighted_sum
FROM table t CROSS APPLY
(VALUES (t.VALUE_A, t.Weight_A),
(t.VALUE_B, t.Weight_B),
(t.VALUE_C, t.Weight_C)
) a(val, w)
WHERE a.val IS NOT NULL;
这就是平均值的计算方法
SELECT *
,CASE
WHEN (W.weight_A + W.Weight_B+ W.Weight_C) = 0
THEN 0
ELSE (ISNULL(VALUE_A, 0 * W.Weight_A)
+ (ISNULL(VALUE_B, 0) * W.Weight_B)
+ (ISNULL(VALUE_C, 0) * W.Weight_C))
/ (W.weight_A + w.Weight_B+ W.Weight_C)
END Average
FROM TABLE t
CROSS APPLY (Select CASE WHEN VALUE_A is null then 0 ELSE ISNULL(Weight_A,100) END [Weight_A]
,CASE WHEN VALUE_B is null then 0 ELSE ISNULL(Weight_B,100) END [Weight_B]
,CASE WHEN VALUE_C is null then 0 ELSE ISNULL(Weight_C,100) END [Weight_C]) W
如果Val为空,是否将重量从总和(w)中排除?查看上面的第二个示例
(1*100+2*80)/(100+80)
,OP似乎想要这种行为。@DanielE。是的,我现在在问题中看到了。这可以通过WHERE
子句轻松处理。
SELECT *
,CASE
WHEN (W.weight_A + W.Weight_B+ W.Weight_C) = 0
THEN 0
ELSE (ISNULL(VALUE_A, 0 * W.Weight_A)
+ (ISNULL(VALUE_B, 0) * W.Weight_B)
+ (ISNULL(VALUE_C, 0) * W.Weight_C))
/ (W.weight_A + w.Weight_B+ W.Weight_C)
END Average
FROM TABLE t
CROSS APPLY (Select CASE WHEN VALUE_A is null then 0 ELSE ISNULL(Weight_A,100) END [Weight_A]
,CASE WHEN VALUE_B is null then 0 ELSE ISNULL(Weight_B,100) END [Weight_B]
,CASE WHEN VALUE_C is null then 0 ELSE ISNULL(Weight_C,100) END [Weight_C]) W