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
尝试为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子句。