【问题标题】:How to find the average of multiple columns with different specific weights?如何找到具有不同特定权重的多个列的平均值?
【发布时间】:2015-05-18 10:51:43
【问题描述】:

我需要在 mssql 中计算 Value_AValue_BValue_C 的平均值。
我的问题是我需要的每一个信息都在一行中。

每个值都有自己的权重:

(sum of values * weight) / (sum weight):

每一列都可以为空。如果有值但没有权重,权重为100,
如果有权重没有值,那么具体的值当然不考虑

例如

第一栏:

(2*100+1*80)/(100+80)= 2.55  ≈ 2.6  

第二栏:

(1*100+2*80)/(100+80)
+------+---------+---------+---------+----------+----------+----------+-----+
| ID   | VALUE_A | VALUE_B | VALUE_C | Weight_A | Weight_B | Weight_C | AVG |
+------+---------+---------+---------+----------+----------+----------+-----+
| 1111 | 2       | 1       | null    | 100      | 80       | 60       | 2.6 |
+------+---------+---------+---------+----------+----------+----------+-----+
| 2222 | 1       | 2       | null    | 100      | 80       | 60       |     |
+------+---------+---------+---------+----------+----------+----------+-----+

我已经走了这么远来获得没有权重的 AVG 值

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

【问题讨论】:

    标签: sql sql-server sum average weighted-average


    【解决方案1】:

    这是你要找的吗?

    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;
    

    【讨论】:

    • 如果 Val 为空,这是否排除了 SUM(w) 的权重?查看(1*100+2*80)/(100+80) 上方的第二个 EG,看起来 OP 想要这种行为。
    • @DanielE。 . . .是的,我现在在问题中看到了这一点。这很容易用WHERE 子句处理。
    【解决方案2】:

    这就是平均值的计算方式

        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
    

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2016-06-19
      相关资源
      最近更新 更多