Mil*_*les 3 sql t-sql sql-server null average
所以我有 3 个不同的列(篮 1、2 和 3)。有时这些列包含所有信息,有时其中一两个为空。我还有另一列,我要将这些值平均并保存。
即使其中一列为空,是否有一种时尚/简单的方法来获得这三列的平均值?或者我是否必须对每个为空的人进行特殊检查?
示例数据(~~为空)
- B1 - B2 - B3 - Avg
------------------------------
- 10 - 20 - 30 - 20
- 10 - ~~ - 30 - 20
- ~~ - 20 - ~~ - 20
Run Code Online (Sandbox Code Playgroud)
我将如何编写 T-SQL 来更新我的临时表?
UPDATE @MyTable
SET Avg = ???
Run Code Online (Sandbox Code Playgroud)
答:感谢 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;
Run Code Online (Sandbox Code Playgroud)
假设您有某种 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
Run Code Online (Sandbox Code Playgroud)
如果您没有 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6069 次 |
最近记录: |