SQL Server - 列"在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中"

msv*_*uze 72 sql-server group-by

我想B在我的下面的SQL中显示该列,但是当我将它添加到查询时它会给我以下错误:

列T2.B'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

我的代码:

SELECT A, COUNT(B) as T1, B 
FROM T2 
WHERE ID=1 
GROUP BY A 
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 135

换句话说,此错误告诉您SQL Server不知道从组中选择哪个 B.

要么你想选择一个特定的值(例如MIN,SUMAVG),在这种情况下,你会使用相应的聚合函数,或者你想选择的每个值作为新行(即包括BGROUP BY字段列表).


请考虑以下数据:

ID  A   B
1   1  13
1   1  79
1   2  13
1   2  13
1   2  42

查询

SELECT A, COUNT(B) AS T1 
FROM T2 
GROUP BY A
Run Code Online (Sandbox Code Playgroud)

会回来:

A  T1
1  2
2  3

这一切都很好.

但是请考虑以下(非法)查询,这会产生此错误:

SELECT A, COUNT(B) AS T1, B 
FROM T2 
GROUP BY A
Run Code Online (Sandbox Code Playgroud)

它返回的数据集说明了问题:

A  T1  B
1  2   13? 79? Both 13 and 79 as separate rows? (13+79=92)? ...?
2  3   13? 42? ...?

但是,以下两个查询使此清楚,并且不会导致错误:

  1. 使用聚合

    SELECT A, COUNT(B) AS T1, SUM(B) AS B
    FROM T2
    GROUP BY A
    
    Run Code Online (Sandbox Code Playgroud)

    会回来:

    A  T1  B
    1  2   92
    2  3   68
    
  2. 将列添加到GROUP BY列表中

    SELECT A, COUNT(B) AS T1, B
    FROM T2
    GROUP BY A, B
    
    Run Code Online (Sandbox Code Playgroud)

    会回来:

    A  T1  B
    1  1   13
    1  1   79
    2  2   13
    2  1   42
    

  • 感谢您的详细解释 - 真的解决了我的一些问题.最初问题的棘手部分是,您可以在某些最佳数据集上运行查询,并且您不会得到该异常.但是当你有一些B的重复数据时,你会收到该异常.因此,使用lc的示例更好地规划查询.放弃了:) (2认同)