SQL语句优化

chinabdx 2016-07-23 11:00:26

declare @deptcode varchar(4),
@startdate datetime,
@enddate datetime
set @deptcode = '0201'
set @startdate = '2016-07-01 00:00'
set @enddate = '2016-07-22 23:59'

SELECT c.stddeptcode,
c.stddeptname,
sum(a.actualmoney) as '销售额',
count(distinct a.flowno) as '客流量',
convert(decimal(18,2),round(sum(a.actualmoney)/count(distinct a.flowno),2)) as '客单价'
FROM inf_gdscode b
left join acc_goodsflow a on b.gdscode = left(a.gdssalecode,8)
and a.deptcode = @deptcode
and a.saletime >= @startdate
AND a.saletime <= @enddate
left join inf_stddept c on b.stddept = c.stddeptcode
where c.stddeptcode in (21,22,23)
group by c.stddeptcode,
c.stddeptname


这个语句还有没有优化的空间了
c.stddeptcode in (21,22,23)这句能不能用Exists进行过滤
...全文
132 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinabdx 2016-07-25
  • 打赏
  • 举报
回复
谢谢三位大神了
卖水果的net 版主 2016-07-24
  • 打赏
  • 举报
回复
1.     left join acc_goodsflow a on b.gdscode = left(a.gdssalecode,8)  表 a 就用不到索引了 2.      left join inf_stddept c on b.stddept = c.stddeptcode      where c.stddeptcode in (21,22,23) 换成 inner join ,并且把 where 换成  b.stddept  in  (21,22,23)
chinabdx 2016-07-24
  • 打赏
  • 举报
回复
跟原来区别不大
chinabdx 2016-07-24
  • 打赏
  • 举报
回复
都不是特别理想
kingtiy 2016-07-23
  • 打赏
  • 举报
回复

 select d.*,c.stddeptname from (
SELECT b.stddept ,      
         sum(a.actualmoney) as '销售额',
         count(distinct a.flowno) as '客流量',
         convert(decimal(18,2),round(sum(a.actualmoney)/count(distinct a.flowno),2)) as '客单价'        
    FROM inf_gdscode b
    left join acc_goodsflow a on b.gdscode = left(a.gdssalecode,8) 
        and a.deptcode = @deptcode
        and a.saletime >= @startdate  
        AND a.saletime <= @enddate     
     where b.stddept  between  21 and 23
 group by b.stddept 
		)  d  left join inf_stddept c on b.stddept = d.stddeptcode
--这样试下?
唐诗三百首 2016-07-23
  • 打赏
  • 举报
回复
建索引 create index ix_acc_goodsflow_saletime_deptcode on acc_goodsflow(saletime,deptcode) include(gdssalecode), 然后用如下写法试试,

declare @deptcode varchar(4),
        @startdate datetime,
        @enddate datetime

set @deptcode = '0201'
set @startdate = '2016-07-01 00:00'
set @enddate = '2016-07-22 23:59'

select c.stddeptcode,
       c.stddeptname,         
       sum(a.actualmoney) as '销售额',
       count(distinct a.flowno) as '客流量',
       convert(decimal(18,2),round(sum(a.actualmoney)/count(distinct a.flowno),2)) as '客单价'        
 from inf_gdscode b
 left join (select gdssalecode=left(gdssalecode,8),
                   actualmoney,
                   flowno
            from acc_goodsflow 
            where deptcode=@deptcode
            and saletime>=@startdate  
            and saletime<=@enddate) a on b.gdscode=a.gdssalecode
 left join inf_stddept c on b.stddept = c.stddeptcode
 where c.stddeptcode in(21,22,23)
 group by c.stddeptcode,c.stddeptname

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧