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

Sql practice的更多相关文章

  1. Sql Practice 2

    之前写了一个SP用来向dimention table插入0 -1 dummy row的值,但今天在process adventureworksdw2008示例 数据库的时候报错,查看了一下,是因为自己 ...

  2. 历经15个小时,终于评出这8本最受欢迎的SQL书籍

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 程序员书库(ID:OpenSourceTop) 原文链接 | https://www.lif ...

  3. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  4. The Practice of .NET Cross-Platforms

    0x01 Preface This post is mainly to share the technologies on my practice about the .NET Cross-Platf ...

  5. 谈一谈SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  6. Partitioning & Archiving tables in SQL Server (Part 1: The basics)

    Reference: http://blogs.msdn.com/b/felixmar/archive/2011/02/14/partitioning-amp-archiving-tables-in- ...

  7. 可输出sql的PrepareStatement封装

    import java.io.InputStream; import java.io.Reader; import java.net.URL; import java.sql.Connection; ...

  8. sql是如何执行一个查询的!

    引用自:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/ Understanding how SQ ...

  9. C#读写SQL Server数据库图片

    效果图: 下载链接: http://download.csdn.net/detail/u010312811/9492402 1.创建一个Winform窗体,窗体分为“数据上传”和“数据读取”两部分: ...

随机推荐

  1. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架开发随笔一

    公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高 ...

  2. sql:Oracle11g 表,视图,存储过程结构查询

    -- Oracle 11 G --20160921 涂聚文再次修改 --Geovin Du --GetTables SELECT owner, object_name, created FROM al ...

  3. learning sql (second edition) script

    create database bank; use bank; /* begin table creation */ create table department (dept_id smallint ...

  4. java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue

    在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://do ...

  5. [Architecture Pattern] Factory Builder

    [Architecture Pattern] Factory Builder 目的 同时提供延迟注入对象.挂载注入项目这两个功能 情景 在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Fac ...

  6. atitit.mp4 视频文件多媒体格式结构详解

    atitit.mp4 视频文件多媒体格式结构详解 1. 一.基本概念1 2. MP4文件概述2 3. mp4是由一个个“box”组成的,2 4. 典型简化mp43 5. Fragments5 6. r ...

  7. 转:NLog之:文件类型目标(File target)

    转:http://www.cnblogs.com/RitchieChen/archive/2012/07/16/2594308.html 英文原文[http://nlog-project.org/wi ...

  8. JAVA基础学习day24--Socket基础一UDP与TCP的基本使用

    一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...

  9. IOS 支付宝-五福简单框架实现-线性滚动(UICollectionView)

    猴年支付宝可算是给大家一个很好的惊喜,刺激.大家都在为敬业福而四处奔波.可是到最后也没有几个得到敬业福德,就像我.不知道大家有没有观察,五福界面的滚动是一个很好的设计.在这里,给大家带来简单的滚动实现 ...

  10. 关于bitcode~

    最近在做语音识别- 在真机调试的时候一直报 ld: '/Users/Chenglijuan/Documents/语音识别/lib/iflyMSC.framework/iflyMSC(IFlyRecog ...