首页 > 解决方案 > 在具有多个不同条件的表中计算多个平均值

问题描述

我正在尝试计算表中多个列的平均值,并且我正在尝试根据 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)

标签: sql-server-2012

解决方案


以下解决方案应该可以实现您的目标。首先,我们使用一些 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

你可以在这个 SQL FIDDLE上看到结果

1   -2  2   -2
  • 注意 - 这确实假设您想要包含的值,因为该BETWEEN语句是包含的。

推荐阅读