一道sql面试题,求解答

jidian90 2013-12-12 06:24:32
tableA(地区表)
colA(地区id) colB(上级地区id)colC(地区名称)
tableB(人员情况表)
colD(人员ic) colE(人员名称) colA(所属地区) colG(人员成本) colH(性别)

1.全国所有人员成本最高的第10名到第20名。

2.所有人员成本总和大于2000的市,按照成本合计由高到低顺序。

3.输入一个地区id,在sql中使用?代替,查询这个地区所有本下级地区包含人数总和,输出格式:地区名称,人数。例如,输入国家id,则输出全国所有市区人数之和;输入北京id,则输出北京所有市区之和;输入海淀区id,则输出这个区人数之和。

4.假设tableA中数据固定为示例数据,性别1为男,0为女。查询输出:
北京 上海
男 所有人数之和 所有人数之和
女 所有人数之和 所有人数之和
...全文
234 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
第一题,最高的10-20。

select * from (
select  colD,colE,dense_rank() over(order by colG desc) as rk from tableb
) where rk between 10 and 20
 --当然面试的话这里可以注明 dense_rank 和 rank区别等等。
第二题,2楼写的就可以了 第三题,注意题目是人数之和

select count(*) as cnt from tableB where colA in (
select colA from tableA 
start with colA = 传入id
connect by prior colA = colB
)
第四题

--测试数据
with tableA as (
select 1 as colA,0 as colB,'北京' as colC from dual
union all
select 2 as colA,0 as colB,'上海' from dual
),
tableB as(
select 1 as colD,'人员1' as colE,1 as colA,2000 as colG,0 as colH from dual
union all
select 2,'人员2',1,2000,0 from dual
union all
select 3,'人员3',1,2000,0 from dual
union all
select 4,'人员4',1,2000,0 from dual
union all
select 5,'人员5',1,2000,1 from dual
union all
select 6,'人员6',2,2000,1 from dual
union all
select 7,'人员7',1,2000,1 from dual
)
--查询sql 
select decode(t.colH,0,'女','男') as gender,
       max(decode(t.colC,'北京',t.cnt,0)) as 北京,
       max(decode(t.colC,'上海',t.cnt,0)) as 上海
       from (
select a.colC,b.colH,count(*) as cnt from tableB b
left join tableA a on a.colA = b.colA
group by colC,colH
) t group by t.colH

--结果
GENDER         北京         上海
------ ---------- ----------
男              2          1
女              4          0

--这里可以解释下本sql的思路:
--首先查出每个地区不同性别的人数,在行转列(由于题目很明显告诉你固定数据)
SnowMote 2013-12-13
  • 打赏
  • 举报
回复
第四题 看错了,该是 count(*)
SnowMote 2013-12-13
  • 打赏
  • 举报
回复
1.全国所有人员成本最高的第10名到第20名。 SELECT * FROM ( SELECT colE(人员名称), colG(人员成本), row_number() over (ORDER BY colG(人员成本)) AS seq FROM tableB ) WHERE seq >= 10 AND seq <= 20 2.所有人员成本总和大于2000的市,按照成本合计由高到低顺序。 SELECT colC, colg FROM ( SELECT a.colC, SUM(b.colG) AS colg FROM tableB b , tableA a WHERE a.colA = b.colA GROUP BY a.colC ) WHERE colg > 2000 ORDER BY colg DESC; 3.输入一个地区id,在sql中使用?代替,查询这个地区所有本下级地区包含人数总和,输出格式:地区名称,人数。例如,输入国家id,则输出全国所有市区人数之和;输入北京id,则输出北京所有市区之和;输入海淀区id,则输出这个区人数之和。 SELECT t.* , ( SELECT SUM(b.colG) AS colg FROM tableB b , ( SELECT t.*, LEVEL FROM tableA t WHERE LEVEL >= 2 START WITH colA = 地区ID CONNECT BY PRIOR colA = colB ) a WHERE a.colA = b.colA ) AS colg FROM tableA t WHERE colB = 地区ID 4.假设tableA中数据固定为示例数据,性别1为男,0为女。查询输出: 北京 上海 男 所有人数之和 所有人数之和 女 所有人数之和 所有人数之和 SELECT sex , CASE sex WHEN '男' THEN ( SELECT SUM(b.colG) AS colg FROM tableB b , ( SELECT t.*, LEVEL FROM tableA t WHERE LEVEL >= 2 START WITH colA = 北京ID CONNECT BY PRIOR colA = colB ) a WHERE a.colA = b.colA AND b.colH = '男' ) WHEN '女' THEN ( SELECT SUM(b.colG) AS colg FROM tableB b , ( SELECT t.*, LEVEL FROM tableA t WHERE LEVEL >= 2 START WITH colA = 北京ID CONNECT BY PRIOR colA = colB ) a WHERE a.colA = b.colA AND b.colH = '女' ) ELSE NULL END AS 北京 , --和上面类似语句,数据可以用函数实现 FROM ( SELECT '男' AS sex, 1 AS seq FROM dual UNION ALL SELECT '女' AS sex, 2 AS seq FROM dual ) ORDER BY seq; 注:仅供参考,因为实际存储数据的关系并没有描述很细。大致如此,至于细节可以按实际情况更改代码即可。
程序员面试金典.Cracking the Coding Interview.第5版 英文版 一书在手,面试机会我有 这本书详细讲解了一般技术公司面试的流程,评价标准设置,最后还有一个章节为你在薪水上讨价还价进行支招。 当然,书中最核心的还是面试中的题目了。本书的题目以算法和数据结构为主,但也分别有一个章节涵盖分布式系统设计,c/c++、java、sql、多线程等知识性的内容。所有题目都有解思路和案,算法题目的实现使用了java。只要有一点java基础的同学,应该都可以看明白。 书中有一道习题使用了后缀树。后缀树这个特殊的结构在《算法导论》等众多书中都没有出现,可以在网上找到一些计算生物学的课件。很多匹配字符串相关的问题都可以用后缀树或者广义后缀树给出一个线性解法。但注意的是这个数据结构所占用的空间也是很大的。虽然一些情况下可以优化到线性,但这种优化在一些具体的问题中会改变问题的语意,因此不是任何时候都可以适用的。对后缀树和广义后缀树感兴趣可以参考http://book.douban.com/subject/1765938/,网上也可以找到一些相关的课件 书中有”连续子序列最大和值“和”最长递增子序列“这样的题目。但是没有包含”连续子序列最大积值“这样的题目,并且”最长递增子序列“给出的解不是最优的,这两个题目大家可以额外思考一下,面试中也很常见。 另外,面试过程中也会遇到很多与系统相关的知识性的题目,如流水线、虚拟内存、进程线程、地址空间结构、异常处理、并发编程等等,这些内容可以参考《深入理解计算机系统》http://book.douban.com/subject/5407246/。 网络相关的内容可以参考《TCP/IP详解》卷一http://book.douban.com/subject/1099252/。 一些更具体的内容,如linux启动过程、linux文件系统原理、浏览器访问网址过程等,可以查看wikipedia相关页面,linux相关的内容可以访问鸟哥的私房菜基础篇的相关文章http://linux.vbird.org/linux_basic/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧