在具有多个不同条件的表中计算多个平均值

时间:2019-07-18 12:42:34

标签: 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

我的目的是基于规则为每一列计算平均值。对于ex: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)

1 个答案:

答案 0 :(得分:1)

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

您可以查看this 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

您可以在this SQL FIDDLE

上查看结果
1   -2  2   -2
  • 注意-由于BETWEEN语句是包含在内的,因此确实假定您希望包含这些值。