【问题标题】:MS-SQL Average Columns with NULL具有 NULL 的 MS-SQL 平均列
【发布时间】:2010-03-02 22:50:37
【问题描述】:

所以我有 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;

【问题讨论】:

    标签: sql sql-server tsql null average


    【解决方案1】:

    假设您有某种 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
    

    【讨论】:

    • 完美,这正是我所需要的
    【解决方案2】:
    SELECT  (
            SELECT  AVG(b)
            FROM    (
                    SELECT  b1 AS b
                    UNION ALL
                    SELECT  b2
                    UNION ALL
                    SELECT  b3
                    ) q
            )
    FROM    mytable
    

    【讨论】:

      【解决方案3】:
      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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多