Средние столбцы MS-SQL с NULL - PullRequest
3 голосов
/ 03 марта 2010

Итак, у меня есть 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 ]

4 голосов
/ 03 марта 2010

Предполагая, что у вас есть какой-то столбец идентификатора, наиболее эффективным способом, вероятно, является использование 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

Если у вас нет столбца идентификатора, вы можете создать суррогатный идентификатор, используя ROW_NUMBER:

;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
1 голос
/ 03 марта 2010
SELECT  (
        SELECT  AVG(b)
        FROM    (
                SELECT  b1 AS b
                UNION ALL
                SELECT  b2
                UNION ALL
                SELECT  b3
                ) q
        )
FROM    mytable
0 голосов
/ 03 марта 2010
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)

и добавьте туда логику, чтобы исключить случаи, когда все три равны нулю, если вам нужно.

...