1.一道SQL语句面试题,关于groupby
表内容:
rq | shengfu |
2005-05-09 | 胜 |
2005-05-09 | 胜 |
2005-05-09 | 负 |
2005-05-09 | 负 |
2005-05-10 | 胜 |
2005-05-10 | 负 |
2005-05-10 | 负 |
如果要生成下列结果, 该如何写sql语句?
rq | 胜 | 负 |
2005-05-09 | 2 | 2 |
2005-05-10 | 1 | 2 |
--第一种解法:
SELECT rq,(SELECT COUNT(1) FROM tbl_shengfu x WHERE x.rq = a.rq AND x.shengfu = '胜') AS 胜,(SELECT COUNT(1) FROM tbl_shengfu y WHERE y.rq = a.rq AND y.shengfu = '负') AS 负 FROM tbl_shengfu a GROUP BY rq;
--第二种解法:
SELECT rq,SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) 胜,SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) 负 FROM tbl_shengfu GROUP BY rq;
2.华为一道面试题
3.请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。
table1
月份mon | 部门dep | 业绩yj |
一月份 | 01 | 10 |
一月份 | 02 | 10 |
一月份 | 03 | 5 |
二月份 | 02 | 8 |
二月份 | 04 | 9 |
三月份 | 03 | 8 |
table2
部门dep | 部门名称dname |
01 | 国内业务一部 |
02 | 国内业务二部 |
03 | 国内业务三部 |
04 | 国际业务部 |
table3 (result)
部门dname | 一月份 | 二月份 | 三月份 |
国内业务一部 | 10 | null | null |
国内业务二部 | 10 | 8 | null |
国内业务三部 | 5 | null | 8 |
国际业务部 | null | 9 | null |
SELECT
dname,
(SELECT yj FROM dbo.table2 a WHERE a.mon = '一月份' AND a.dep = d.dep) 一月份,
(SELECT yj FROM dbo.table2 b WHERE b.mon = '二月份' AND b.dep = d.dep) 二月份,
(SELECT yj FROM dbo.table2 c WHERE c.mon = '三月份' AND c.dep = d.dep) 三月份
FROM dbo.table1 d;
4.一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
SELECT (CASE WHEN a>b THEN a ELSE b END) x,(CASE WHEN b>c THEN b ELSE c END) y FROM tbl;
5.SQL面试题
假设只有一个table,名为pages,有四个字段,id, url,title,body。里面储存了很多网页,网页的url地址,title和网页的内容,然后你用一个sql查询将url匹配的排在最前,title匹配的其次,body匹配最后,没有任何字段匹配的,不返回。
select a.[id],a.mark from
(
select [page].[id],100 as mark from [page] where [page].[url] like '%abc%'
union
select [page].[id],50 as mark from [page] where [page].[title] like '%abc%'
union
select [page].[id],10 as mark from [page] where [page].[body] like '%abc%'
) as a order by mark DESC
6.sql面试题
有以下三张表,
Class表
classid | classname |
1 | 高三(一)班 |
2 | 高三(二)班 |
3 | 高三(三)班 |
Student表
studentid | studentName | classid |
1 | 张三 | 2 |
2 | 李四 | 1 |
3 | 王五 | 1 |
4 | 赵六 | 3 |
5 | 钱七 | 2 |
6 | 孙九 | 3 |
score表
scoreid | course | studentid | score |
1 | 数学 | 2 | 99 |
2 | 数学 | 3 | 60 |
3 | 数学 | 4 | 80 |
4 | 语文 | 5 | 79 |
5 | 语文 | 6 | 58 |
6 | 语文 | 1 | 66 |
7 | 英语 | 6 | 76 |
8 | 英语 | 4 | 87 |
9 | 英语 | 3 | 100 |
10 | 英语 | 2 | 69 |
要求:
编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数
--Class
create table #class
(
classid int,
classname nvarchar(20)
)
insert into #class
select 1,'高三(一)班' union all
select 2,'高三(二)班' union all
select 3,'高三(三)班';
--Student
create table #student
(
studentid int,
studentname nvarchar(20),
classid int
)
insert into #student
select 1,'张三',2 union all
select 2,'李四',1 union all
select 3,'王五',1 union all
select 4,'赵六',3 union all
select 5,'钱七',2 union all
select 6,'孙九',3;
--Score
create table #score
(
scoreid int,
course nvarchar(20),
studentid int,
score int
)
insert into #score
select 1,'数学',2,99 union all
select 2,'数学',3,60 union all
select 3,'数学',4,80 union all
select 4,'语文',5,79 union all
select 5,'语文',6,58 union all
select 6,'语文',1,66 union all
select 7,'英语',6,76 union all
select 8,'英语',4,87 union all
select 9,'英语',3,100 union all
select 10,'英语',2,69;
SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY className,course ORDER BY score DESC) rn,className,studentName,course,score
FROM dbo.#score a,dbo.#student b,dbo.#class c
WHERE a.studentId = b.studentId AND b.classId = c.classId)
e WHERE e.rn = 1;
( 注:第二道题愣是没读懂,不知道什么意思。最后一道题写法似乎有点麻烦,不知道是否还有更简单的写法。如果有,大家可以一起交流哦。)