select (datepart(w,d.LOGDATE)-1) as WeekDay,
convert(varchar(100),d.logdate,101) as logdate,d.employeeno,e.[name],d.mono,d.opno,d.opname,d.employeegroup,e.DESIGNATIONCODE,
convert(numeric(8,3),round((case when d.actpiecerate>0 then d.actpiecerate else d.stdpiecerate end),3))as piecerate,sum(quantity)as qty,
convert(numeric(8,2),round((case when d.actpiecerate>0 then d.actpiecerate else d.stdpiecerate end),3)*sum(quantity))as rate from sdt..dyempsumm d inner join common.dbo.Employee e
on e.employeeno=d.employeenowhere d.logdate between @logdate1 and @logdate2 and d.mono between 
@mono1 and @mono2 and d.opno  between @opno1 and @opno2  --and d.garmentpart between @garmentpart1 and @garmentpart2
 and d.employeeno between @employeeno1 and @employeeno2
and  d.employeegroup between @employeegroup1 and @employeegroup2
and (convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,1,1),Null) 
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,3,1),Null)
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,5,1),Null) 
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,7,1),Null)
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,9,1),Null)
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,11,1),Null)
    or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,13,1),Null) 
    or @WD is null)
group by d.LOGDATE,convert(varchar(100),d.logdate,101),d.employeeno,e.[name],d.mono,d.opno,d.opname,d.employeegroup,e.DESIGNATIONCODE,
(case when d.actpiecerate>0 then d.actpiecerate else d.stdpiecerate end)
order by d.employeeno,convert(varchar(100),d.logdate,101),d.mono,d.opno,d.opname,d.employeegroup

解决方案 »

  1.   

    (convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,1,1),Null)  
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,3,1),Null)
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,5,1),Null)  
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,7,1),Null)
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,9,1),Null)
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,11,1),Null)
      or convert(varchar(1),datepart(w,d.LOGDATE)-1)=IsNull(substring(@WD,13,1),Null)  
      or @WD is null)这个地方貌似有些问题。 没看懂 IsNull(substring(@WD,1,1),Null)  是要干什么。另外,没有查询结果要求的话。 确实很难分析语句的可优化部分。 LZ还请提供数据和要求的结果看看。 
      

  2.   

    结构上就是
    select * from a left join b on a.id=b.id where +group by +order by 
    联查后加上条件分组排序如果要优化,就需要从字段上来处理,例如有没有判断重复的,有没有case when 不当的。