问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL四个小题

发布网友 发布时间:2022-04-07 22:16

我来回答

4个回答

懂视网 时间:2022-04-08 02:37

     题目一:如下表所示,现需要按照收款员统计收款和退款合计金额。

技术分享

     实现结果需如下显示:

     技术分享

     分析:想要的结果(记为表B)和源数据(记为表A)相比,有共同的列(收款员),不同的是表A的金额根据标记和收款员分成了两列,所以这个需求可以用语言表述一下:首先根据收款员分组(group by),然后当标记为“收”时,金额计入收款合计(sum);当标记为“退”时,金额计入退款合计(sum)。当……时……,这不就是SQL的条件判断嘛?盘点SQL的条件语句不多,if……else……和case……when……then……else……end。这样问题就迎刃而解了。

     解决方案如下:

with ta as
(select '收' as 标记,'100' as 收款员,150 as 金额
 union
 select '收','100',375
 union
 select '退','100',78
 union select '收','200',74
)

select 收款员,sum(case when 标记='收' then 金额 else 0 end) as 收款合计,
 sum(case when 标记='退' then 金额 else 0 end) as 退款合计 from ta
 group by 收款员

      题目二:如下表A(左边)职员信息表,其中ID为职员工号,name为职员姓名;表B(右边)为职员任务分配表,其中ID为职员工号(和表A中ID对应),Task为任务编号。

技术分享                              技术分享

      现需求每个职员的任务数。结果如下显示:

技术分享

      其实原题是这样的:只有一张表B,求求每个职员的任务数。没有找到比较好的方法实现,不做讨论,欢迎高人指点。

      分析:此题的难点在于表B中的ID复杂表示,其实这样有悖于数据库的设计原则,理应表A和表B的ID一一对应。既然是题,我们只能从当前的条件入手了,攻破难点的关键在于判断A中ID在B中ID出现与否,如果出现那么如何统计出现的次数。判断出现与否需要用到函数CHARINDEX。

     解决方案如下:

--创建测试数据
WITH TA
AS
(SELECT '1,2' AS ID,'job1' AS task
UNION SELECT '1,2,3','job3'
UNION SELECT '2,3','job2'
UNION SELECT '3,4,5','job4')
,TB AS 
(SELECT '1' AS ID,'张三' as name
UNION SELECT '2','王二'
UNION SELECT '3','李四'
UNION SELECT '4','李明'
UNION SELECT '5','王五')

SELECT B.ID,B.name,COUNT(1) AS TASKS
 FROM TA A,TB B
 WHERE CHARINDEX(B.ID,A.ID)>0
 GROUP BY B.ID,B.name
 order by B.ID

     题目三:原题参见博客:http://www.cnblogs.com/Lumia1020/p/4571301.html

     如下表City所示,code为行政区域码(六位数字,前两代表省级,中间两位代表市级,最后两位代表县级,不考虑xx00xx情况),city为城市名称,CCode为该城市所属的省级或者市级行政区域码。

技术分享

     现需求如下结果: 

技术分享

     分析:分析表city,code的含义十分明显,所需要的结果也很明显,如果是省就是显示省份;是市则显示为所属省级+市级;是县级则显示为所属省级+所属市级+县级。貌似可以用题目一分析中提到的SQL条件语句实现,但是转念一想,还是有差别,这里需要先判断city属于省级?市级?县级?然后在对应起来的,这样还得有参照表,复杂了。回到结果表中来进行分析,其实判定city属于省市县的问题并不难,code的含义已经说明了,只要转换表述:在表City中,当code的后四位为“0000”时,肯定是省级;当code的后两位为“00”,并且后四位不为“0000”时,肯定是市级;当code后两位不为“00”时,为县级。这样省市县的判定就一目了然了,然后,根据市级编码追朔所属的省级,并得出所属省级+市级,县级追朔所属的市级,得出所属省级+所属市级+所属县级,通过运用这种简单的递归思想,解决方案便跃然纸上了。

     解决方案如下:

--测试数据
with ta as
(select '110000' as code, '北京市' city, '110000' Ccode
union
select N'110200', N'西城区', N'110200'
union
select N'110300', N'崇文区', N'110300'
union
select N'430000', N'湖南省', N'430000'
union
select N'430100', N'长沙市', N'430100'
union
select N'430101', N'望城县', N'430100')

select * into City from ta

select * from City;

--解决方案
with ta
as(
--省级
select code,city,Ccode,city content from City where right(code,4)='0000'),
tb as(
--市级
select b.code,b.city,b.Ccode,a.city+','+b.city as content from ta a,City b where left(a.Ccode,2)=left(b.Ccode,2)
and right(b.code,2)='00' and right(b.code,4)<>'0000'),
tc as(
select c.code,c.city,c.Ccode,b.content+','+c.city content from tb b,City c where left(b.Ccode,4)=left(c.Ccode,4)
and right(c.code,2)<>'00')
select * from ta
union
select * from tb
union
select * from tc

      通过上述几道小题,常思常新,温故了SQL的部分知识,当然方法很多,变式很多,如题目二统计表B中每个Task的人数等。不足之处,欢迎各位指点!

     

关于SQL的几道小题详解

标签:sql   面试题   

热心网友 时间:2022-04-07 23:45

1.select s.sno,s.sn from s join sc on sc.sno=s.sno join c on c.cno=sc.cno where c.cn='数据库概论'
2.select s.sno,s.sn from s where s.sno in (select sc.sno from sc group by sno having count(*)=(select count(*) from c))
3.select s.sno,s.sn from s where s.sno in (select sc.sno from sc group by sno having count(*)>=5)
4.delete from sc where sc.cno in (select c.cno from c where c.cn='数据结构'
delete from c where c.cn='数据结构'

热心网友 时间:2022-04-08 01:03

select sno,sn from table where cn='数据库概论’
select sno,sn from table where cn in all

select sno from table where count(cn)>5
delete cn='数据结构' from table

热心网友 时间:2022-04-08 02:38

1.关系代数的演算比较复杂,也无法在文本状态下书写,(我也忘的差不多了)请参阅《数据库原理》等相关书籍
2.(1) select sc_cnt.sno from (select sno, count(*) as cnt from sc group by sno hanving count(*) >= 5) sc_cnt;
(2) delete from sc where exist(select * from c where c.cno = sc.cno and c.cn = '数据结构'); delete from c where c.cn = '数据结构';

希望对你有帮助
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 生鲜水果蔬菜销售渠道更多的采用长而宽对嘛? vivox7扣扣消息不弹屏是怎么回事,各项权限都开了 vivo x7plus QQ来消息 不显示消息内容 短信却显示 怎么回事 vivo x7plus QQ来消息不显示消息内容,短信却显示,怎么回事? 电脑设备配置怎么看 电脑设备组成怎么看 正常的情况下C盘的内存占用量是多少 内存跟C盘的关系是什么? 如何查看图片收藏图片的网址 以图找图 貌似是个日本的网站。 可以找出原画者是谁。 我的电脑里显示的C盘和D盘是内存还是硬盘 你说的内存是那个内存 是 电脑C盘的内存还是 C盘剩余内存 还是电脑的CPU ? 我记得有几个网站可以识别动漫插画的画师和网站的,但是网址忘了,谁有,就是上传一张图片就可以帮你找到 C盘是不是就是内存 请问:黄。色图片存在QQ的什么地方最好?而且不会被和。谐 电脑里的A盘B盘C盘属于硬盘还是内存? 有个网站是提供图片的,上面有很多有个性的图片,分为专辑啊那些,是粉红色的主页,那个能告诉我网址? qq色表情图片我在找,大神有qq色表情图片吗 请问c盘是内存还是外存啊?操作系统存放在哪里啊?RAM用来临时存放正在处理的指令,那ROM用来干嘛啊? 电脑的C盘是否就是硬盘的内存 要解决蔬菜滞销的办法是什么? 把中国的蔬菜运到国外去卖,应该怎么操作? 康佳与TCL哪个更好,为什么? 康佳,海信,创维,TCL哪个牌子好 景甜资料的父亲是谁 菜农蔬菜卖不出去,他们有什么解决的办法? 详细了解康佳和tcl电视哪个好 如果承包一片土地种植种植蔬菜不打农药不施肥,纯绿色蔬菜,如何卖出去? 景甜的父母是干什么的 如何打通瓜果蔬菜销售渠道,推动农业增产,农民增收,恢复农业生产秩序? TCL,康佳,长虹,创维的电视机哪个牌子好? 康佳电视与TCL电视哪个好? 液晶电视机康佳和TCL哪个好些 康佳和TCL的液晶电视哪个好 娱乐圈内最具有校花气质的四位女演员,个个都是正当红,分别是谁? tcl 海信 创维 康佳哪个好 腾达路由器的售后电话是多少 TCL和康佳电视哪个好 司藤:景甜戏红人不红,那么美怎么就是红不起来呢? 腾达路由器的石家庄售后在哪??电话多少??