如何获得部分计数的总数

use*_*111 0 sql-server sql-server-2000

这里是这个问题的扩展,我怎样才能获取所有达到允许缺席人数上限的学生的人数。

我试过这个

SELECT COUNT(*) FROM
(
SELECT student_id,
       COUNT(attendance)
FROM   student_attendance
WHERE  attendance = 'ABSENT'
GROUP  BY student_id
HAVING COUNT(attendance) = (SELECT max_allowed
                            FROM   configurations)
) abc
Run Code Online (Sandbox Code Playgroud)

但它不起作用并出现此错误:

未为“abc”的第 2 列指定任何列。

环境: SQL Server 2000

Sco*_*red 5

尝试为COUNT(attendance)-添加列名,例如CountAttendance.

SELECT COUNT(*) FROM
(
SELECT student_id,
       COUNT(attendance) as CountAttendance
FROM   student_attendance
WHERE  attendance = 'ABSENT'
GROUP  BY student_id
HAVING COUNT(attendance) = (SELECT max_allowed
                            FROM   [configuration])
) a ;
Run Code Online (Sandbox Code Playgroud)

COUNT(attendance)SELECT子查询的子句中删除也应该有效(如您所见)。

但是为什么非别名列COUNT会导致问题?

因为子查询中的所有列都应该命名/别名。一些 DBMS(和一些版本)不需要这个,因为它们自己提供任意名称。其他的,如 SQL Server,则更具限制性。

您甚至可以SELECT 1 AS c在子查询或SELECT NULL AS c. 外部查询只需要计算行数,COUNT(*)因此子查询中的列列表完全无关。重要的是WHEREandHAVING子句。