首页 > 开发 > 综合 > 正文

Sql面试常考题(持续添加)

2024-07-21 02:47:24
字体:
来源:转载
供稿:网友
Sql面试常考题(持续添加)

  最近萌生换工作的念头,于是上网下载了一些公司的面试题,重新看了面试题中的Sql部分,这些查询题有时候只是兜一个弯角来考,对于给EF惯坏的孩子来说还是有点难度的(给面试官鄙视了几下的结果),所以列出最近感觉比较有意思的Sql查询题。

1.查询出子节点最多的NodeName,如下图的table,

NodeName子节点
节点11
节点22
节点31
节点31
节点31
节点42
节点43

 1 declare @t table( id int ,NodeName varchar(50 ),parentId int) 2  3 insert into @t 4 select 4, '节点1' ,1 5 union all 6 select 5, '节点2' ,2 7 union all 8 select 6, '节点3' ,1 9 union all10 select 7, '节点3' ,111 union all12 select 1, '节点3' ,113 union all14 select 2, '节点4' ,215 union all16 select 3, '节点4' ,317 18 select * from @t19 20 select top 1  nodename, COUNT(*) from @t group by NodeName order by COUNT(*) desc
View Code

2.有表A如下图,需要转换成表B格式

单号金额

Rk1 10

Rk2 20

Rk3 -30

Rk4 -10

  表A

单号 收入 支出

Rk1 10 0

Rk2 20 0

Rk3 0 30

Rk4 0 10

  表B

 1 declare @t table(danhao nvarchar(20),amount int) 2 insert into @t 3 select 'PK1',10 UNION 4 select 'PK2',20 UNION 5 select 'PK3',-10 UNION 6 select 'PK4',-30  7 select * from @t 8 select danhao, 9 (case when amount>0 then amount else 0 end) as N'收入',10 (case when amount>0 then 0 else amount end) as N'支出'11 from @t
View Code

3.有一张表T_Scores,记录比赛成绩

Date Name Score2008-8-8 拜仁 胜2008-8-9 奇才 胜2008-8-9 湖人 胜2008-8-10 拜仁 负2008-8-8 拜仁 负2008-8-12 奇才 胜要求输出下面的格式:Name 胜 负拜仁 1 2湖人 1 0奇才 2 0
 1 declare @t table(DateT datetime,name nvarchar(20),Score nvarchar(20)) 2 insert into @t 3 select '2008-8-8',N'拜仁',N'胜' union all 4 select '2008-8-8',N'奇才',N'胜' union all 5 select '2008-8-8',N'湖人',N'胜' union all 6 select '2008-8-8',N'拜仁',N'负' union all 7 select '2008-8-8',N'拜仁',N'胜' union all 8 select '2008-8-8',N'拜仁',N'胜' union all 9 select '2008-8-8',N'奇才',N'胜' union all10 select '2008-8-8',N'湖人',N'负'11 select name,12 SUM(case Score when N'胜' then 1 else 0 end)as N'胜',13 SUM(case Score when N'负' then 1 else 0 end)as N'负'14 from @t15 group by name
View Code

4.根据下图列表求和

idvalue
11
22
52
62
83
94

 1 declare @t table( id int ,value int ) 2 insert into @t 3 select 1, 1 4 union all 5 select 2, 2 6 union all 7 select 5, 2 8 union all 9 select 6, 210 union all11 select 8, 312 union all13 select 9, 414 15 select * from @t16 --1.按id 排序,取得所有的奇数 (单数) 行value之和17 18 select SUM (m. value) from(19 select ROW_NUMBER () over (order by id )row, id,value from @t)m20 WHERE m .row% 2=121 22 --2.取得所有id 为奇数的行 value之和23 select SUM (value) from @t where id% 2=1
View Code

5.行转列5.1与列转行5.2

5.1如下图所示

nameclassscore
张三语文74
张三数学83
张三物理93
李四语文74
李四数学84
李四物理94
转换成
name语文数学物理
张三748393
李四748494
 1 declare @t table ( name varchar (10), 课程 varchar (10), score int ) 2  3 insert into @t 4 select ' 张三', '语文' ,74 5 union all 6 select ' 张三', '数学' ,83 7 union all 8 select ' 张三', '物理' ,93 9 union all10 select ' 李四', '语文' ,7411 union all12 select ' 李四', '数学' ,8413 union all14 select ' 李四', '物理' ,9415 16 select * from @t17 18 select name,19 max(case 课程 when '语文' then score else 0 end) 语文 ,20 max(case 课程 when '数学' then score else 0 end) 数学 ,21 max(case 课程 when '物理' then score else 0 end) 物理22 from @t23 group by name
View Code

5.2列转行

 1 declare @t table ( 姓名 varchar (10), 语文 int ,数学 int,物理 int) 2  3 insert into @t 4 select ' 张三', 74,83 ,93 5 union all 6 select ' 李四', 74,84 ,94 7  8 select * from 9 (10  select 姓名,课程 ='语文 ',分数 =语文 from @t11  union all12  select 姓名,课程 ='数学 ',分数 =数学 from @t13  union all14  select 姓名,课程 ='物理 ',分数 =物理 from @t15 )m
View Code

  后期等待多了之后再用心整理成一份Sql文档,现在题目还少,努力去涵盖面试中遇到的,谢谢观看。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表