Sql practice
employee表 数据准备
use tempdb go if OBJECT_ID('employee') is not null drop table employee ;with employee(id,name,salary,manager_id) as ( select * from ( values (1,'John',300,3), (2,'Mike',200,3), (3,'Sally',550,4), (4,'Jane',500,7), (5,'Joe',600,7), (6,'Dan',600,3), (7,'Phil',550,NULL) ) as ve(id,name,salary,manager_id) ) select * into employee from employee
--1.Give the names of employees, whose salaries are greater than their immediate managers':
SELECT e.name FROM employee AS e JOIN employee AS m ON e.manager_id = m.id WHERE e.salary > m.salary
--2.What is the average salary of employees without direct reports
--method1 SELECT Avg(e.salary) AS avgsalry FROM employee AS e LEFT JOIN employee AS m ON m.manager_id = e.id WHERE m.id IS NULL --method2 SELECT Avg(e.salary) AS avgsalary FROM employee AS e WHERE NOT EXISTS (SELECT * FROM employee AS m WHERE m.manager_id = e.id)
/******************************************************************************************/
第二题的数据准备:student course courseSelection 三张表
if OBJECT_ID('student','u') is not null drop table student if OBJECT_ID('course','u') is not null drop table course if OBJECT_ID('courseSelection','u') is not null drop table courseSelection ;with student(student_no,student_name) as ( SELECT * FROM (values (1,'John'), (2,'Mike'), (3,'Sally'), (4,'Jane'), (5,'Joe'), (6,'Dan'), (7,'Phil') ) as vstudent(student_no,student_name) ) select * into student from student ;with course (Course_no,Course_name,Course_teacher,Course_credit) as ( SELECT * FROM ( VALUES (1,'Java','Steve',12), (2,'SQLServer','Bill',8), (3,'Windows','Robert',16), (4,'Art','Evan',7), (5,'C#','Steve',9), (6,'HTML','Robert',12), (7,'Finance','Tom',9) ) as vcourse(Course_no,Course_name,Course_teacher,Course_credit) ) select * into course from course ;with CourseSelection(student_no,Course_no,Grade) as ( select * from (values (3,3,57), (3,3,52), (3,3,59), (3,6,57), (3,6,75), (6,2,89), (1,3,93), (1,6,88), (6,7,88), (6,1,99) ) as vcs (student_no,Course_no,Grade) ) select * into CourseSelection from CourseSelection
--1.Find the students name who pass both "Finance" and "SQLServer" and their average grade(pass means "grade" >= 60).
SELECT DISTINCT s.student_name, cs.avggrade FROM student AS s JOIN (SELECT Avg(grade) OVER( partition BY student_no) AS avggrade, * FROM courseselection) AS cs ON s.student_no = cs.student_no JOIN course AS c ON cs.course_no = c.course_no WHERE c.course_name IN ( 'SQLServer', 'Finance' ) AND cs.grade >= 60
--2.Find the students name who failed one course more than 3 times and current still not passed.
--max(grade) <60 and group by course_no having count(*)>=3
SELECT s.student_name FROM student AS s JOIN (SELECT student_no FROM courseselection AS cs GROUP BY student_no, course_no HAVING Count(*) > 2 AND Max(grade) < 60) AS cs ON cs.student_no = s.student_no
--3.Update teacher "Tom" 's grade for everyone, for those grade >= 90, deduct 10, for those grade between 65 and 89, deduct 5, the rest remain.
UPDATE cs SET cs.grade = CASE WHEN cs.grade > 90 THEN cs.grade - 10 WHEN cs.grade BETWEEN 65 AND 89 THEN cs.grade - 5 ELSE cs.grade END FROM course AS c JOIN courseselection AS cs ON c.course_no = cs.course_no WHERE c.course_teacher = 'Tom'
--4.Find the average grade each teacher give to their students, sort the result by descending,
-- if one student attend one course more than once, only take the highest grade into account.
SELECT c.course_teacher, Avg(cs.grade) AS avgGrade FROM course AS c JOIN (SELECT course_no, Max(grade) AS grade FROM courseselection GROUP BY student_no, course_no) AS cs ON c.course_no = cs.course_no GROUP BY c.course_teacher ORDER BY avggrade DESC
--5. Find the student names who is qualify to graduate with following conditions:
--a. Total earn course_credit >= 50
--b. Failed no more than 5 courses
--c. The maximum of course_credit from one teacher is 20.(one teacher may have more than one courses)
SELECT s.student_name FROM student AS s JOIN (SELECT student_no, Sum (CASE WHEN totalcreditfromoneteacher > 20 THEN 20 ELSE totalcreditfromoneteacher END) AS TotalCredit FROM (SELECT student_no, course_teacher, Sum (CASE WHEN cs.grade > 60 THEN c.course_credit ELSE 0 END) AS TotalCreditFromOneTeacher FROM course AS c JOIN courseselection AS cs ON cs.course_no = c.course_no GROUP BY student_no, course_teacher) AS A GROUP BY student_no) AS cs ON cs.student_no = s.student_no JOIN (SELECT DISTINCT student_no FROM courseselection cs GROUP BY student_no, course_no HAVING Count(DISTINCT course_no) < 5) AS stuentfaillessthan5courses ON s.student_no = stuentfaillessthan5courses.student_no WHERE cs.TotalCredit>50