MS-SQL平均数列包含NULL值

3

我有三列不同的数据(篮子1、2和3),有时这些列中包含所有信息,有时其中一列或两列为空。我还有另一列要将这些值求平均并保存。

是否有一种简单的方法来计算这三列的平均值,即使其中一个为空?还是我必须对每个为空的列进行特殊检查?

示例数据(~~表示为空)

- B1 - B2 - B3 - Avg
------------------------------
- 10 - 20 - 30 - 20
- 10 - ~~ - 30 - 20
- ~~ - 20 - ~~ - 20

我该如何编写T-SQL来更新我的临时表?

UPDATE @MyTable
   SET Avg = ???

答案: 感谢Aaronaught提供的方法,我使用了他的方法。我将把我的代码放在这里,以防有其他人遇到相同的问题。

WITH AverageView AS
(
    SELECT Results_Key AS xxx_Results_Key,
            AVG(AverageValue) AS xxx_Results_Average
    FROM @MyResults
        UNPIVOT (AverageValue FOR B IN (Results_Basket_1_Price, Results_Basket_2_Price, Results_Basket_3_Price)) AS UnpivotTable
    GROUP BY Results_Key
)   
UPDATE @MyResults
    SET Results_Baskets_Average_Price = xxx_Results_Average
    FROM AverageView
    WHERE Results_Key = xxx_Results_Key;
3个回答

5
假设您有某种ID列,最有效的方法可能是使用UNPIVOT,这样您就可以使用普通的基于行的AVG运算符(它忽略NULL值):
DECLARE @Tbl TABLE
(
    ID int,
    B1 int,
    B2 int,
    B3 int
)

INSERT @Tbl (ID, B1, B2, B3) VALUES (1, 10, 20, 30)
INSERT @Tbl (ID, B1, B2, B3) VALUES (2, 10, NULL, 30)
INSERT @Tbl (ID, B1, B2, B3) VALUES (3, 10, NULL, NULL)

SELECT ID, AVG(Value) AS Average
FROM @Tbl
UNPIVOT (Value FOR B IN (B1, B2, B3)) AS u
GROUP BY ID

如果您没有 ID 列,可以使用 ROW_NUMBER 生成替代 ID:
;WITH CTE AS
(
    SELECT
        B1, B2, B3,
        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ID
    FROM @Tbl
)
SELECT ID, AVG(Value)
FROM CTE
UNPIVOT (Value FOR B IN (B1, B2, B3)) AS u
GROUP BY ID

完美,这正是我所需要的。 - Miles

1
SELECT  (
        SELECT  AVG(b)
        FROM    (
                SELECT  b1 AS b
                UNION ALL
                SELECT  b2
                UNION ALL
                SELECT  b3
                ) q
        )
FROM    mytable

0
SELECT (ISNULL(B1,0) + ISNULL(B2,0) + ISNULL(B3,0))
/(CASE WHEN B1 IS NULL THEN 0 ELSE 1 END
+CASE WHEN B2 IS NULL THEN 0 ELSE 1 END
+CASE WHEN B3 IS NULL THEN 0 ELSE 1 END)

如果需要的话,可以在其中放置逻辑来排除所有三个都为空的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接