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;
So I've got 3 different columns (basket 1, 2, and 3). Sometimes these columns have all the information and sometimes one or two of them are null. I have another column that I'm going to average these values into and save.
Is there a sleek/easy way to get the average of these three columns even if one of them is null? Or do I have to have a special check for each one being null?
Example data( ~~ is null)
- B1 - B2 - B3 - Avg
------------------------------
- 10 - 20 - 30 - 20
- 10 - ~~ - 30 - 20
- ~~ - 20 - ~~ - 20
How would I write the T-SQL to update my temp table?
UPDATE @MyTable
SET Avg = ???
Answer:
Thanks to Aaronaught for the method I used. I'm going to put my code here just in case someone else has the same thing.
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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
假设您有某种 ID 列,最有效的方法可能是使用
UNPIVOT
,这样您就可以使用普通的基于行的AVG
运算符(它会忽略NULL
值):如果您没有 ID 列,则可以使用
ROW_NUMBER
生成代理 ID:Assuming you have some sort of ID column, the most effective way is probably to use
UNPIVOT
so you can use the normal row-basedAVG
operator (which ignoresNULL
values):If you don't have the ID column, you can generate a surrogate ID using
ROW_NUMBER
:并在其中添加逻辑以排除所有三个都为空的情况(如果需要)。
and put logic in there to exclude cases where all three are null if you need to.