SQL数据表处理练习
SQL数据表处理练习
有一个 工作表 如下:
以下输出结果全部依分钟计算。
(一)输出所有数据中通话时间最长的5条记录:
select top 5 * from 工作 order by DATEDIFF(MI,开始时间,结束时间) desc
输出结果:
(二)输出所有数据中拨打长途号码的总时长:
select SUM(DATEDIFF(mi,开始时间,结束时间)) as 长途电话总时长 from 工作 where 电话 like '0%'
输出结果:
(三)输出本月通话时长最多的前三位员工工号:
select top 3 工号,SUM(DATEDIFF(mi,开始时间,结束时间)) as 本月通话总时长前三 --输出 from 工作 where DATEPART(MM,开始时间) = DATEPART(MM,GETDATE()) --判断 获取通话时间和当前时间的月份是否相等 group by 工号 --根据工号分组 order by SUM(DATEDIFF(mi,开始时间,结束时间)) desc --根据通话时长 降序排列
输出结果:
(四)输出本月拨打电话次数最多的员工编号:
select top 3 工号,COUNT(*) as 拨打电话次数 --输出 from 工作 --工作表 where DATEDIFF(MM,开始时间,GETDATE()) =0 --判断通话时间和当前时间的月份是否为0,如果为0,则是本月。 group by 工号 --根据 工号 分组 order by COUNT(*) desc --根据次数降序排列
输出结果:
(五)输出所有数据的拨号流水,并在最后一行添加总呼时长:
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%'
输出结果:
另一种写法:
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 工作
输出结果: