|
在手动选择语句执行中,表值函数、临时表和操作查询的运行差异其实并不大。然而在执行存储过程的对比中,经测试,效率高低依次是:表值函数>临时表>操作查询。所以,当数据量较大的时候,建议创建表值函数来处理。- CREATE FUNCTION [dbo].[callData0](@startDate date)
- RETURNS @callSummary table(工号 varchar(50), 工作天数 int,总通话次数 int,总通话时长 int,接通数 int)
- as begin
- declare @firstDay date
- set @firstDay=DATEADD(day,1-day(@startDate),@startDate)
- delete from @callSummary
- insert into @callSummary
- select b.工号,count(distinct b.日期) 工作天数,sum(通话次数) 总通话次数,
- sum(dbo.char2Secs(通话时长)) 总通话时长,sum(接通次数) 接通数
- from tblstaff a , tblWidth b
- where a.客服工号=b.工号 and b.日期 between @firstDay and @startDate
- group by b.工号
- RETURN
- end
复制代码 在存储过程中调用即可:- CREATE proc [dbo].[insertShow]
- (@startDate date = null)
- as begin
- if @startDate is null
- set @startDate=GETDATE()
- declare @sDate date
- set @sDate=DATEADD(day,-1,@startDate)
- --更新通话数据
- update tblshow0 set
- tblshow0.工作天数=a.工作天数,tblshow0.总通话次数=a.总通话次数,
- tblshow0.总通话时长=a.总通话时长,tblshow0.接通数=a.接通数,
- tblshow0.日均时长=case when a.工作天数>0 then round(a.总通话时长/convert(float,a.工作天数),0) else null end,
- tblshow0.次均时长=case when a.接通数>0 then round(a.总通话时长/convert(float,a.接通数),0) else null end,
- tblshow0.接通率=case when a.接通数>0 then a.接通数/convert(float,a.总通话次数) else null end
- from dbo.callData0(dateadd(day,-1,@sDate)) a where tblshow0.工号=a.工号 and tblshow0.日期=@sDate
- end
复制代码
|
|