SQL数据表处理练习

有一个 工作表 如下:

image.png

以下输出结果全部依分钟计算。

(一)输出所有数据中通话时间最长的5条记录:

select top 5 * from 工作 order by DATEDIFF(MI,开始时间,结束时间) desc

输出结果:

image.png

(二)输出所有数据中拨打长途号码的总时长:

select SUM(DATEDIFF(mi,开始时间,结束时间)) as 长途电话总时长 from 工作 where 电话 like '0%'

输出结果:

image.png

(三)输出本月通话时长最多的前三位员工工号:

select top 3 工号,SUM(DATEDIFF(mi,开始时间,结束时间)) as 本月通话总时长前三     --输出
from 工作 
where DATEPART(MM,开始时间) = DATEPART(MM,GETDATE())   --判断 获取通话时间和当前时间的月份是否相等
group by 工号    --根据工号分组
order by SUM(DATEDIFF(mi,开始时间,结束时间)) desc   --根据通话时长 降序排列

输出结果:

image.png

(四)输出本月拨打电话次数最多的员工编号:

select top 3 工号,COUNT(*) as 拨打电话次数  --输出
from 工作 --工作表
where DATEDIFF(MM,开始时间,GETDATE()) =0   --判断通话时间和当前时间的月份是否为0,如果为0,则是本月。
group by 工号   --根据 工号 分组
order by COUNT(*) desc   --根据次数降序排列

输出结果:

image.png

(五)输出所有数据的拨号流水,并在最后一行添加总呼时长:

select 工号,电话,DATEDIFF(MI,开始时间,结束时间) as 通话时长 from 工作   -- 先得到所有拨号数据
union all  
select '汇总',
CONVERT(varchar(50),SUM(DATEDIFF(mi,开始时间,结束时间))), -- 输出 长途通话时长。CONVERT 是将 长途通话时长 转变为 varchar 类型。与上面  电话 类型 匹配。
(select SUM(DATEDIFF(mi,开始时间,结束时间)) from 工作 where 电话 not like '0%')  --子查询 输出市内通话时长
from 工作 
where 电话 like '0%'

输出结果:

image.png


另一种写法:

select 工号,电话,DATEDIFF(MI,开始时间,结束时间) as 通话时长 from 工作   -- 先得到所有拨号数据
union all  
select '汇总',
CONVERT(varchar(50),sum((
case
when 电话 like '0%' then DATEDIFF(MI,开始时间,结束时间)
else 0
end
))) as 长途通话总时长,
sum((
case
when 电话 not like '0%' then DATEDIFF(MI,开始时间,结束时间)
else 0
end
))as 市内通话总时长
from 工作

输出结果:

image.png


更新日期: 2018年08月27日
文章标签: SQL语句SQL基础MSSQL数据库DATE
文章链接: http://www.qljia.com/post/74.html