如何从更多列中选择但按1列分组?

时间:2011-09-27 04:44:03

标签: sql-server sql-server-2005

SELECT        studentnum
FROM            Atten
WHERE        (att = 'Yes') AND (unitCode = 'MMA1034') 
GROUP BY studentnum
HAVING        (COUNT(*) < 4)

如何选择更多列?例如,student_name也是?

3 个答案:

答案 0 :(得分:5)

如果学生信息在学生表中,则查询可能如下所示:

SELECT student_name, student_birth_day, studentnum
FROM Student S
RIGHT JOIN (
  SELECT studentnum, count(*) as cnt
  FROM   Attendance
  WHERE (attStatus = 'Yes') 
  AND   (unitCode = 'MMA1034')
  GROUP BY studentnum
  HAVING (COUNT(*) < 4)
) A
ON A.studentnum = S.studentnum

答案 1 :(得分:0)

来自GROUP BY (Transact-SQL)

  

每个表或视图列中的任何非聚合表达式    列表必须包含在GROUP BY列表中

因此,如果在选择列表中未进行聚合,则必须将其包含在组中。

因此,如果您希望在选择列表中使用student_name,那么您需要

SELECT  studentnum,
        student_name
FROM    Attendance 
WHERE   (attStatus = 'Yes') 
AND     (unitCode = 'SIT103') 
AND     (CONVERT(VARCHAR, attDate, 101) < '10/10/2011') 
GROUP BY    studentnum,
            student_name
HAVING  (COUNT(*) < 4)

答案 2 :(得分:-2)

如果student_name存在于同一个表中,则需要在学生之后传递它

SELECT studentnum,student_name

如果student_name存在于不同的表中,则需要使用连接。