繁体   English   中英

SQL 中的 MIN、MAX 和 AVG 分析查询

[英]Analytical Query in SQL for MIN, MAX, and AVG

我试图找出这个问题的查询:对于每个专业,列出学生人数、最低 GPA、最高 GPA、平均 GPA、最小年龄、最大年龄和平均年龄。 (显示带 2 个小数点的 GPA,不带小数点的年龄。您可能会发现使用之前的查询之一创建视图很有用。)

这是为 SQL 创建表的脚本!

REM drop all the tables. Note that you need to drop the
REM dependent table first before dropping the base tables.

drop table Reg;
drop table Student;
drop table Course;

REM Now create all the tables.

create table Student
(
    sid char(10) primary key,
    sname varchar(20) not null, 
    gpa float, 
    major char(10), 
    dob DATE
);

create table Course
(
    cno char(10) primary key,
    cname varchar(20) not null, 
    credits int, 
    dept char(10)
);

create table Reg
(
    sid references Student(sid) on delete cascade,  
    cno references Course(cno) on delete cascade,  
    grade char(2),  
    primary key (sid, cno)
);

REM Now insert all the rows.

insert into Student values ('111', 'Joe', 3.5 , 'MIS', '01-AUG-2000');
insert into Student values ('222', 'Jack', 3.4  , 'MIS', '12-JAN-1999');
insert into Student values ('333', 'Jill', 3.2 , 'CS', '15-MAY-1998');
insert into Student values ('444', 'Mary', 3.7 , 'CS', '17-DEC-2001');
insert into Student values ('555', 'Peter', 3.8 , 'CS', '19-MAR-1999');
insert into Student values ('666', 'Pat', 3.9,  'Math', '31-MAY-2000');
insert into Student values ('777', 'Tracy', 4.0,  'Math', '18-JUL-1997');

insert into Course values ('c101', 'intro', 3 , 'CS');
insert into Course values ('m415', 'database', 4 , 'Bus');
insert into Course values ('m215', 'programming', 4 , 'Bus');
insert into Course values ('a444', 'calculus', 3 , 'Math');

insert into Reg values ('111', 'c101', 'A');
insert into Reg values ('111', 'm215', 'B');
insert into Reg values ('111', 'm415', 'A');
insert into Reg values ('222', 'm215', 'A');
insert into Reg values ('222', 'm415', 'B');
insert into Reg values ('333', 'c101', 'A');
insert into Reg values ('444', 'm215', 'C');
insert into Reg values ('444', 'm415', 'B');
insert into Reg values ('555', 'c101', 'B');
insert into Reg values ('555', 'm215', 'A');
insert into Reg values ('555', 'm415', 'A');
insert into Reg values ('666', 'c101', 'A'); 

这是我到目前为止所拥有的:

SELECT major,      
  count(distinct SID) as students,      
  round(min(gpa), 2),      
  round(max(gpa), 2),      
  round(avg(gpa), 2),      
  trunc(min(sysdate - dob)/365) as min_age,      
  trunc(max(sysdate - dob)/365) as max_age,      
  trunc(avg(sysdate - dob)/365) as avg_age, 
FROM Student 
GROUP BY MAJOR;

根据您的输入,我进行了查询,我相信会向您显示结果。 (很难以您发布表格的方式阅读表格)。 语法可能因您的 DBMS(SQL Server、MySQL、REdshift、Postgres 等)而异

这是查询:

SELECT major,
 COUNT(*) as students,
 ROUND(MIN(gpa), 2) as min_gpa,
 ROUND(MAX(gpa), 2) as max_gpa,
 ROUND(AVG(gpa), 2) as avg_gpa,
 MIN(DATEDIFF(year, current_date, dob)) as min_age,
 MAX(DATEDIFF(year, current_date, dob)) as max_age,
 AVG(DATEDIFF(year, current_date, dob)) as avg_date
 FROM students st left join Course co on co.dept = st.major
GROUP BY major

您的查询完全没问题(只需在 avg_age.

SELECT major,      
  count(distinct SID) as students,      
  round(min(gpa), 2)  as MinGPA,      
  round(max(gpa), 2)  as MaxGPA,      
  round(avg(gpa), 2)  as AvgGPA,      
  round(min(sysdate - dob)/365,0) as min_age,      
  round(max(sysdate - dob)/365,0) as max_age,      
  round(avg(sysdate - dob)/365,0) as avg_age
FROM Student 
GROUP BY MAJOR;

您还可以使用months_between() 和 floor() 来获得相同的结果:

select * from student;
SELECT major,      
  count(distinct SID) as students,      
  round(min(gpa), 2) as MinGPA,      
  round(max(gpa), 2) as MaxGPA,      
  round(avg(gpa), 2) as AvgGPA,
  floor(min(months_between(trunc((sysdate)), dob)) /12) as min_age,      
  floor(max(months_between(trunc((sysdate)), dob)) /12) as max_age,      
  floor(avg(months_between(trunc((sysdate)), dob)) /12) as avg_age
  
  
FROM Student 
GROUP BY MAJOR;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM