zoukankan      html  css  js  c++  java
  • 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
    Looking for a job working at Home about MSBI
  • 相关阅读:
    js中有哪些是循环遍历的方法?
    堆内存和栈内存
    Html5和Css3
    PyCharm IDE 的使用
    python基础语法
    数据挖掘书籍简介
    寄存器-2
    汇编基础
    Std::bind()
    手游页游和端游的服务端框架
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/3450586.html
Copyright © 2011-2022 走看看