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

求帮解这几道SQL的题

发布网友 发布时间:2022-04-29 23:13

我来回答

2个回答

懂视网 时间:2022-04-30 03:35

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

技术分享

     实现结果需如下显示:

     技术分享

     分析:想要的结果(记为表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-30 00:43

1.创建数据表[宿舍表]代码;
   宿舍表(宿舍号 char(6),宿舍电话)
   要求使用:主键(宿舍号)、宿舍电话:以633开头的7位电话号码
create table 宿舍表
(宿舍号 char(6) primary key,
宿舍电话 varchar(7) check (宿舍电话 like '633%'))
 
2.将下列宿舍信息添加到宿舍表的代码 
       宿舍号      宿舍电话
        101         6331157
        102         6331777
insert into 宿舍表 values ('101','6331157')
insert into 宿舍表 values ('102','6331777')  
        修改  宿舍号为101的宿舍电话:6331158
update 宿舍表 set 宿舍电话='6331158' where rtrim(宿舍号)='101' 
        删除  宿舍号为102的宿舍信息
delete from 宿舍表 where rtrim(宿舍号)='102'

3.创建视图[同学表视图]代码 ;
   同学表视图(学号, 姓名, 性别, 年龄, 民族, 身份证号, 宿舍号, 宿舍电话)
create view 同学表视图
as
select 同学表.学号,同学表.姓名,同学表.性别,同学表.年龄,同学表.民族,同学表.身份证号,同学表.宿舍号,同学表.宿舍电话
from 同学表,宿舍表 where 同学表.宿舍号=宿舍表.宿舍号 

4.从同学表视图中查询姓张的女同学的姓名、性别、宿舍电话。 
select 姓名,性别,宿舍电话
from 同学表视图 where 姓名 like '张%' and 性别='女'

5.从同学表中查询女同学的最大年龄、最小年龄、平均年龄。
select max(年龄) as 最大年龄,min(年龄) as 最小年龄,avg(年龄) as 平均年龄
from 同学表 where 性别='女'


少年,这个其实没什么太难的,多看看书就会,希望你能顺利通过考试

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 “萝卜子”也是中药吗?入药有什么用处? 山楂、梨、箩卜水功效? 5.手机进水与自动关机的处理方法 返回&gt;&gt; iphone6进水后,手机总是像按了home键一样自动返回主界面 手机进水后手机老是自动启动返回 如何能取消返回键 三星A8000 iphone6进水后,手机总是自动返回主界面是什么原因? 手机进水了不断重启,返回 请问大佬有小小食杂铺2015年上映的由小田切让主演的高清视频在线观看资源吗 早春知春不久归百般红艳斗芳菲写出了怎样的景色? 问大家一个问题,最美的时光电视剧,到最后苏曼到底选择了谁? 微信转账页面显示的名字最后一个字是微信绑定的身份证或者银行卡吗? 电视剧最美的时光2什么时候会出来 《最美的时光》 最美的时光有第二部吗?叫啥名字! 我在微信上用银行卡转账,对方会看到我的名字吗 最美的时光 - 电视剧全集 - 高清在线观看 - 迅雷看看 最美的时光有第二部吗 最美的时光是否不久会有第二部 最美的时光是不是有第二部 是不是还有第二部 最美的时光电视剧40集全集在哪看 我想退出怎么办理? 我累了我想退出但我却忍不下心你觉得我是应该继续还是应该退出? 我想退出,请问怎么退? 我想退出怎么办 这段时间我发现我越来越腐,咋办呀?赶快帮帮我,我想退出了。 我想退出,怎么退? 小米4s为什么在官网买不到 为什么官网不卖小米4s了 我想退出会员,如何退出? 合伙开店,现在我想退出,怎么办啊? 为什么小米官网小米4s停售了呢,这么久一直都是缺货,是不是停产了,好像才刚出来的吧 小米4s官网怎么下架了 我想退出好友群如何退出? 小米4s上市3个月就下架是什么原因 小米商城怎么没有小米4s了? 我想退出一段友情,需要征求对方意见吗? 小米4s为什么下架 在哪里能买到小米官网已售罄 为什么小米商城里没有了小米4s这部手机??? 网曝小米4S已下架小米商城,是定位错误还是销量不佳 发售3个月就下架:定位4C升级版的小米4S什么情况