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

Sql server 2012 在具有多个不同条件的表中计算多个平均值,sql-server-2012,Sql Server 2012,我试图计算表中多个列的平均值,并试图根据where子句施加规则来计算此平均值。由于这些列中的大多数没有不同的值,因此无法使用GROUPBY子句来获得正确的结果。包含所有条件的简单where子句无法正确计算平均值。这个问题有解决办法吗 我的桌子看起来像 col1 col2 col3 col4 0 -3 0 109 3 2 -1 -108 -4 -1 3 3 2 0 4 2 2 1

我试图计算表中多个列的平均值,并试图根据where子句施加规则来计算此平均值。由于这些列中的大多数没有不同的值,因此无法使用GROUPBY子句来获得正确的结果。包含所有条件的简单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之间的值, 平均值(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
或者,您可以使用此查询来避免使用
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
  • 注意-这假定您希望值包含在内,因为
    BETWEEN
    语句是包含在内的

因此,计算满足where条件的值的平均值?非常感谢。但是,有没有一种方法可以做到这一点而不必创建多个CTE?上述方法是否存在问题?提供数据后,它有效地解决了问题,并且在<50秒内,SLOCI添加了一个版本,而无需使用
CTE
@KaramGlad来听它的帮助@卡拉姆
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