Office中国论坛/Access中国论坛

标题: 巧用表值函数更新数据 [打印本页]

作者: roych    时间: 2019-3-15 11:37
标题: 巧用表值函数更新数据
在手动选择语句执行中,表值函数、临时表和操作查询的运行差异其实并不大。然而在执行存储过程的对比中,经测试,效率高低依次是:表值函数>临时表>操作查询。所以,当数据量较大的时候,建议创建表值函数来处理。
  1. CREATE FUNCTION [dbo].[callData0](@startDate date)
  2. RETURNS @callSummary table(工号 varchar(50), 工作天数 int,总通话次数 int,总通话时长 int,接通数 int)
  3. as begin
  4. declare @firstDay date
  5. set @firstDay=DATEADD(day,1-day(@startDate),@startDate)
  6. delete from  @callSummary
  7. insert into @callSummary
  8. select b.工号,count(distinct b.日期) 工作天数,sum(通话次数) 总通话次数,
  9.         sum(dbo.char2Secs(通话时长)) 总通话时长,sum(接通次数) 接通数
  10.         from tblstaff a , tblWidth b
  11.         where a.客服工号=b.工号  and b.日期 between @firstDay and @startDate
  12.         group by b.工号
  13. RETURN
  14. end
复制代码
在存储过程中调用即可:
  1. CREATE  proc [dbo].[insertShow]
  2. (@startDate date = null)
  3. as begin
  4. if @startDate is null
  5. set @startDate=GETDATE()

  6. declare @sDate date
  7. set @sDate=DATEADD(day,-1,@startDate)

  8. --更新通话数据
  9. update tblshow0 set
  10. tblshow0.工作天数=a.工作天数,tblshow0.总通话次数=a.总通话次数,
  11. tblshow0.总通话时长=a.总通话时长,tblshow0.接通数=a.接通数,
  12. tblshow0.日均时长=case when a.工作天数>0 then round(a.总通话时长/convert(float,a.工作天数),0) else null end,
  13. tblshow0.次均时长=case when a.接通数>0 then round(a.总通话时长/convert(float,a.接通数),0) else null end,
  14. tblshow0.接通率=case when a.接通数>0 then a.接通数/convert(float,a.总通话次数) else null end
  15. from dbo.callData0(dateadd(day,-1,@sDate)) a where tblshow0.工号=a.工号 and tblshow0.日期=@sDate

  16. end
复制代码


作者: zpy2    时间: 2019-3-15 11:48
roych 发表于 2019-3-15 11:37
在手动选择语句执行中,表值函数、临时表和操作查询的运行差异其实并不大。然而在执行存储过程的对比中,经 ...

不错,赞赞。。
作者: zpy2    时间: 2019-3-15 11:54
zpy2 发表于 2019-3-15 11:48
不错,赞赞。。

数据有多少m,不知道用access,MySQL,sqlite快不快
作者: tmtony    时间: 2019-3-15 13:07
赞一个,roych 现有有电信的大样品数据,测试这些很方便啊
作者: ganlinlao    时间: 2019-3-18 21:54
赞!
作者: admin    时间: 2019-3-20 11:47

赞!
作者: wuwu200222    时间: 2020-12-8 16:18
学习
作者: GOODWIN    时间: 2021-10-11 10:18
学习




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3