日期:2014-05-18  浏览次数:20509 次

谁帮我优化一下这个SQL语句?在线等
--废品率图表的废品率查询
declare   @dtCur   datetime
declare   @Faculty   varchar(4)

declare   @dtB   datetime
declare   @dtE   datetime
declare   @dtTemp   datetime

set   @dtCur   =   '2007-1-1 '
set   @Faculty= '三科 '
set   @dtB= '2007-1-1 '
set   @dtE= '2007-1-31 '

set   @dtB   =   convert(datetime,convert(char(8),@dtCur,120)+ '1 ')
set   @dtE   =   Dateadd(day,-1,convert(char(8),dateadd(month,1,@dtCur),120)+ '1 ')
set   @dtTemp=@dtB
create   table   dt(d   varchar(8),dt   datetime)

declare   @MonthDay   varchar(8)
while(@dtTemp <=@dtE)
begin
    set   @MonthDay   =   cast(month(@dtTemp)   as   varchar(2))+ '- '+cast(day(@dtTemp)   as   varchar(2))
    insert   into   dt   (d,dt)
  select   @MonthDay,@dtTemp
  set   @dtTemp   =   dateadd(day,1,@dtTemp)
end
---114筛选   103修剪(我就觉地下面的语句效率很低,查询很慢,应该优化)
select   d,T.dt,a,w,Ajc,Rate   from   dt   T   left   join
  (select   dt,sum(a)   a,sum(w)   w,sum(AJc)   AJc,
Case   when   sum(AJc)   >   0   then   cast((1.00*sum(W)/sum(AJc)*100)   as   numeric(10,2))   else   0   end   as   Rate
  from
  (select   convert(char(10),a.produceDate,120)   dt,a,w,
case   when   ASx   is   not   NULL
  then   ASx   else   AXj   end   as   Ajc
  from   (select   sum(WasterQtyT)   w,ProductNo,ProduceDate
  from   gwkBaseData  
  where   ProduceDate> =@dtB
  and   ProduceDate <=@dtE
  and   Faculty=@Faculty
  group   by   ProductNo,ProduceDate)   A   left   join   (
select   sum(ActualQty+WasterQtyT)   A,ProductNo,ProduceDate
  from   gwkBaseData  
  where   ProduceDate> =@dtB
  and   ProduceDate <=@dtE   and   WPNo= '101 '
  and   Faculty=@Faculty
  group   by   ProductNo,ProduceDate)   B   on   A.ProductNo   =   B.ProductNo   and   A.ProduceDate   =   B.ProduceDate   left   join
  (select   sum(ActualQty+WasterQtyT)   ASx,ProductNo,ProduceDate
  from   gwkBaseData  
  where   ProduceDate> =@dtB
  and   ProduceDate <=@dtE   and   WPNo= '114 '
  and   Faculty=@Faculty
  group   by   ProductNo,ProduceDate)   C   on   A.ProductNo   =   C.ProductNo   and   A.ProduceDate   =   C.ProduceDate   left   join
  (select   sum(ActualQty+WasterQtyT)   AXj,ProductNo,ProduceDate
  from   gwkBaseData  
  where   ProduceDate> =@dtB
  and   ProduceDate <=@dtE   and   WPNo= '103 '
  and   Faculty=@Faculty
  group   by   ProductNo,ProduceDate)   D   on   A.ProductNo   =   d.ProductNo   and   A.ProduceDate   =   D.ProduceDate)   G   group   by   dt)   H   on   T.dt=H.dt

drop