SQL组代码错误

SQL组代码错误,sql,sql-server,Sql,Sql Server,在这个非常小的代码中,它不断地告诉我“组”周围有一些错误,但在我看来,代码是非常正确的吗 SELECT grades.PERSON_ID, grades.GRADE, students.PERSON_ID, students.ENROLL_PERIOD, students.FACULTY_ID FROM students INNER JOIN grades ON students.PERSON_ID = grades.PERSON_ID W

在这个非常小的代码中,它不断地告诉我“组”周围有一些错误,但在我看来,代码是非常正确的吗

      SELECT
    grades.PERSON_ID, grades.GRADE, 
    students.PERSON_ID, students.ENROLL_PERIOD, students.FACULTY_ID
FROM  
    students 
INNER JOIN 
    grades ON students.PERSON_ID = grades.PERSON_ID 
WHERE 
    GRADE = '00' or
    GRADE ='-3' or
    GRADE ='U' or
    GRADE ='SY' or
    GRADE ='IA' or
    GRADE ='NI'
GROUP BY
    students.PERSON_ID
ORDER BY 
    students.PERSON_ID;

如果您没有对列使用聚合函数,那么select中的所有函数都应该在GROUPBY子句中。分组方式根据列/列进行分组

SELECT
        grades.PERSON_ID, grades.GRADE, 
        students.PERSON_ID, students.ENROLL_PERIOD, students.FACULTY_ID
    FROM  
        students 
    INNER JOIN 
        grades ON students.PERSON_ID = grades.PERSON_ID 
    WHERE 
        GRADE = '00' or
        GRADE ='-3' or
        GRADE ='U' or
        GRADE ='SY' or
        GRADE ='IA' or
        GRADE ='NI'
    GROUP BY
        grades.PERSON_ID, grades.GRADE, 
        students.PERSON_ID, students.ENROLL_PERIOD, students.FACULTY_ID
    ORDER BY 
        students.PERSON_ID;

您需要使用聚合函数从每个组中找出最大等级。 试试这个

SELECT
    students.PERSON_ID, Max(grades.GRADE) As Max_GRADE
FROM  
    students 
INNER JOIN 
    grades ON students.PERSON_ID = grades.PERSON_ID 
WHERE 
    GRADE = '00' or
    GRADE ='-3' or
    GRADE ='U' or
    GRADE ='SY' or
    GRADE ='IA' or
    GRADE ='NI'
GROUP BY
    students.PERSON_ID
ORDER BY 
    students.PERSON_ID;

我猜你根本不想要聚合。只有这些成绩之一的学生

您的查询可以通过三种方式简化:

  • 表别名
  • IN
  • 在结果集中不包括两次
    PERSON\u ID
因此,试着将其写成:

SELECT s.PERSON_ID, g.GRADE, s.ENROLL_PERIOD, s.FACULTY_ID
FROM students s INNER JOIN 
     grades g
     ON s.PERSON_ID = g.PERSON_ID 
WHERE g.GRADE IN ('00', '-3', 'U', 'SY', 'IA', 'NI')
ORDER BY s.PERSON_ID;
如果您希望每个
个人ID
有一个任意行(如错误使用
分组依据所示),可以使用SQL Server技巧:

SELECT TOP (1) WITH TIES . . .
. . . 
ORDER BY RANK() OVER (PARTITION BY s.PERSON_ID ORDER BY (SELECT NULL))

将此
GRADE='NI'或
更改为此
GRADE='NI'
让我猜猜,MySQL背景?如果是,则与:同样,将此
students.PERSON\u ID,
更改为
students.PERSON\u ID
如果不使用聚合函数,为什么要分组?“Most”建议使用
MAX()
函数,为什么不使用它?列“grades.PERSON_ID”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。。。原因是什么?似乎找不到分数最高的人?它只是列出了所有属于这些等级的人员ID