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