Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,在多个条件下使用GROUPBY子句的正确方法是什么?_Mysql_Sql_Group By - Fatal编程技术网

在MySQL中,在多个条件下使用GROUPBY子句的正确方法是什么?

在MySQL中,在多个条件下使用GROUPBY子句的正确方法是什么?,mysql,sql,group-by,Mysql,Sql,Group By,我正在写一个查询,如果每个专业的平均成绩超过80分,就会找到最年轻的学生,并从下面的关系中按他们的名字排序。我正在使用MySQL服务器和MySQL工作台 学生: snum: integer name: string major: string level: string age: integer cname: string meets_at: time room: string fid: integer snum (foreign key) name (foreign key) score

我正在写一个查询,如果每个专业的平均成绩超过80分,就会找到最年轻的学生,并从下面的关系中按他们的名字排序。我正在使用MySQL服务器和MySQL工作台

学生

snum: integer
name: string
major: string
level: string
age: integer
cname: string
meets_at: time
room: string
fid: integer
snum (foreign key)
name (foreign key)
score 

snum: integer
name: string
major: string
level: string
age: integer
cname: string
meets_at: time
room: string
fid: integer
snum (foreign key)
name (foreign key)
score 
等级

snum: integer
name: string
major: string
level: string
age: integer
cname: string
meets_at: time
room: string
fid: integer
snum (foreign key)
name (foreign key)
score 
下面是我如何尝试实现该查询的

select S.major, S.name, S.age
from student S , grades G
group by S.major
Having MIN(S.age) and G.score > (Select avg(G.score) 
                                from grades G1 , student S
                                where S.snum = G1.snum) ;
然而,这不起作用,我真的很困惑查询应该是什么样子

样本数据:

CREATE TABLE students
(`snum` int, `name` varchar(18), `major` varchar(22), `standing` varchar(2), 
`age` int)
 ;

INSERT INTO student
(`snum`, `name`, `major`, `standing`, `age`)
VALUES
(578875478, 'Edward Baker', 'Veterinary Medicine', 'SR', 21),
(574489456, 'Betty Adams', 'Economics', 'JR', 20),
(573284895, 'Steven Green', 'Kinesiology', 'SO', 19),
(567354612, 'Karen Scott', 'Computer Engineering', 'FR', 18),
(556784565, 'Kenneth Hill', 'Civil Engineering', 'SR', 21),
(552455318, 'Ana Lopez', 'Computer Engineering', 'SR', 19),
(550156548, 'George Wright', 'Education', 'SR', 21),
(462156489, 'Donald King', 'Mechanical Engineering', 'SO', 19),
(455798411, 'Luis Hernandez', 'Electrical Engineering', 'FR', 17),
(451519864, 'Mark Young', 'Finance', 'FR', 18),
(351565322, 'Nancy Allen', 'Accounting', 'JR', 19),
(348121549, 'Paul Hall', 'Computer Science', 'JR', 18),
(322654189, 'Lisa Walker', 'Computer Science', 'SO', 17),
(320874981, 'Daniel Lee', 'Electrical Engineering', 'FR', 17),
(318548912, 'Dorthy Lewis', 'Finance', 'FR', 18),
(301221823, 'Juan Rodriguez', 'Psychology', 'JR', 20),
(280158572, 'Margaret Clark', 'Animal Science', 'FR', 18),
(269734834, 'Thomas Robinson', 'Psychology', 'SO', 18),
(132977562, 'Angela Martinez', 'History', 'SR', 20),
(115987938, 'Christopher Garcia', 'Computer Science', 'JR', 20),
(112348546, 'Joseph Thompson', 'Computer Science', 'SO', 19),
(99354543, 'Susan Martin', 'Law', 'JR', 20),
(60839453, 'Charles Harris', 'Architecture', 'SR', 22),
(51135593, 'Maria White', 'English', 'SR', 21);

CREATE TABLE grades
(`snum` int, `cname` varchar(23), `score` int);

INSERT INTO grades
(`snum`, `cname`, `score`)
VALUES
(574489456, 'Urban Economics', 45),
(567354612, 'Operating System Design', 98),
(567354612, 'Data Structures', 100),
(552455318, 'Operating System Design', 98),
(552455318, 'Communication Networks', 87),
(455798411, 'Operating System Design', 100),
(455798411, 'Optical Electronics', 87),
(348121549, 'Database Systems', 90),
(322654189, 'Database Systems', 97),
(322654189, 'Operating System Design', 56),
(301221823, 'Perception', 87),
(301221823, 'Social Cognition', 87),
(115987938, 'Database Systems', 100),
(115987938, 'Operating System Design', 98),
(112348546, 'Database Systems', 80),
(112348546, 'Operating System Design', 35),
(99354543, 'Patent Law', 65)
 ;
预期成果:

+------------------------+----------------+----+---------+---+
| Computer Engineering   | Karen Scott    | 18 | 99.0000 | 1 |
+------------------------+----------------+----+---------+---+
| Computer Science       | Paul Hall      | 18 | 90.0000 | 1 |
+------------------------+----------------+----+---------+---+
| Electrical Engineering | Luis Hernandez | 17 | 93.5000 | 1 |
+------------------------+----------------+----+---------+---+
| Psychology             | Juan Rodriguez | 20 | 87.0000 | 1 |
+------------------------+----------------+----+---------+---+

下面是一种可能适用于您的用例的方法。逻辑是将聚合和窗口函数结合起来

首先,您可以使用一个简单的聚合查询来计算每个学生的平均分数:

SELECT s.major, s.name, s.age, AVG(g.score) avg_score
FROM 
    students s
    INNER JOIN grades g ON g.snum = s.snum
GROUP BY s.snum, s.major, s.name, s.age
HAVING AVG(g.score) > 80
这将为平均分数高于80的每个学生提供一个记录,以及他的年龄、姓名、专业和平均分数

现在剩下要做的就是在每组学生中选出最年轻的一个专业相同的学生。这可以通过窗口函数
行号()来完成。

与示例数据一起返回:

| major                  | name           | age | avg_score |
| ---------------------- | -------------- | --- | --------- |
| Computer Engineering   | Karen Scott    | 18  | 99        |
| Computer Science       | Paul Hall      | 18  | 90        |
| Electrical Engineering | Luis Hernandez | 17  | 93.5      |
| Psychology             | Juan Rodriguez | 20  | 87        |

按每个系列出最小的学生:请给我们看
表及其与其他系的关系。没有系,这是个错误。好吧。请给我们一些样本数据和预期输出,以帮助我们理解您的问题,好吗?请参阅以了解更多详细信息。好的,我添加了schema details.Nice。现在您只需添加预期的结果,就可以了。谢谢,这很有效!你能解释x*指的是什么吗?它选择了所有属性吗?@a_a_a:欢迎
x
是聚合子查询的别名,
x.*
表示:子查询返回的所有列。