设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2387|回复: 7
打印 上一主题 下一主题

巧用表值函数更新数据

[复制链接]
跳转到指定楼层
1#
发表于 2019-3-15 11:37:56 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
在手动选择语句执行中,表值函数、临时表和操作查询的运行差异其实并不大。然而在执行存储过程的对比中,经测试,效率高低依次是:表值函数>临时表>操作查询。所以,当数据量较大的时候,建议创建表值函数来处理。
  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
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-19 00:04 , Processed in 0.119254 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表