sql-server-2012 - 在具有多个不同条件的表中计算多个平均值
问题描述
我正在尝试计算表中多个列的平均值,并且我正在尝试根据 where 子句强加规则来计算该平均值。由于我在大多数这些列上没有不同的值,因此我无法执行 group by 子句来获得正确的结果。包含所有条件的简单 where 子句无法正确计算平均值。有解决此问题的方法吗?
我的桌子看起来像
col1 col2 col3 col4
0 -3 0 109
3 2 -1 -108
-4 -1 3 3
2 0 4 2
2 1 107 -2
我的意图是根据规则计算每列的平均值。例如:avg(col1) 应该包含 0 到 100 之间的值,avg(col2) 应该包含 -1 到 -100 之间的值,avg(col3) 应该包含 0 到 100 之间的值,avg(col4) 应该包含 - 1 到 -100。
select avg(col1), avg(col2), avg(col3), avg(col4) from tbl1
where (col1 between 0 and 100) and (col1 between -1 and -100) and (col3 between 0 and 100) and (col4 between -1 and -100)
解决方案
以下解决方案应该可以实现您的目标。首先,我们使用一些 CTE(子查询)将列中的值限制为我们想要的值,然后我们得到它们的平均值。
WITH
first_col AS
(
SELECT col1
FROM the_table
WHERE col1 >= 0 and col1 <= 100
),
second_col AS
(
SELECT col2
FROM the_table
WHERE col2 >= -100 and col2 <= -1
),
third_col AS
(
SELECT col3
FROM the_table
WHERE col3 >= 0 and col3 <= 100
),
fourth_col AS
(
SELECT col4
FROM the_table
WHERE col4 >= -100 and col4 <= -1
)
SELECT
AVG(first_col.col1),
AVG(second_col.col2),
AVG(third_col.col3),
AVG(fourth_col.col4)
FROM
first_col,
second_col,
third_col,
fourth_col
您可以查看此 SQL FIDDLE以获取结果。
1 -2 2 -2
或者,您可以使用此查询来避免使用CTE
SELECT
AVG(CASE WHEN col1 >= 0 AND col1 <= 100 THEN col1 END) AS col1avg,
AVG(CASE WHEN col2 >= -100 AND col2 <= -1 THEN col2 END) AS col2avg,
AVG(CASE WHEN col3 >= 0 AND col3 <= 100 THEN col3 END) AS col3avg,
AVG(CASE WHEN col4 >= -100 AND col4 <= -1 THEN col4 END) AS col4avg
FROM
the_table
1 -2 2 -2
- 注意 - 这确实假设您想要包含的值,因为该
BETWEEN
语句是包含的。
推荐阅读
- python - 如何从 Python 循环创建 PySpark DataFrame
- sql - BigInt 不会转换为正确的日期格式
- c# - 如何在 .Net Core 中使用 Nancy 引导 Automapper?
- azure - 如何成功将 IR 网关连接到 Redshift 并拉取数据?
- javascript - 在一组动态创建的表格之间显示多条水平线
- javascript - 在 ASP.NET MVC 中格式化日期
- wpf - Powershell GUI,从 ListView 调用 Active Directory 的特定属性
- php - Laravel DB Max Connections 错误在单个 GET 请求中引发两次
- r - 查找一组(ID)中的连续出现
- docusignapi - Docusign 无法更新模板文档中的表单字段或自定义字段