连锁店商场的老板,是个守财奴式的人物,他对数目看得很严,所以他提出了这样的一个需求:
在一个sql语句里返回以下内容
1、昨天所有商场的交易金额
2、假设昨天是周一,显示再前面3个周一的交易金额。
3、将前面4个周一的交易金额取平均值 
4、平均值与昨天的交易量来个对比商场交易记录表如下:商场号 日期 交易金额需要得到的sql结果如下:商场号 昨天金额   一周前 两周前 三周前 比率
我写的sql语句如下:select a.shopid,昨天,上周,两周前,三周前,一月前,(昨天+上周+两周前+三周前)/4 平均 ,昨天/平均 比率 from
(select shopid,amount 昨天 from shopn_daystat  where trunc(r_date)=Trunc(sysdate)-1) a,
(select shopid,amount 上周 from shopn_daystat  where trunc(r_date)=Trunc(sysdate)-8) b,
(select shopid,amount  两周前 from shopn_daystat  where trunc(r_date)=Trunc(sysdate)-15) c,
(select shopid,amount 三周前 from shopn_daystat  where trunc(r_date)=Trunc(sysdate)-22) d 
   where a.shopid=b.shopid and  b.shopid=c.shopid and c.shopid=d.shopid 
应该怎么优化呢?

解决方案 »

  1.   

    --方法如 : 并在 r_date字段加上索引 Select shopid,昨天,上周,两周前,三周前,一月前,
          (昨天+上周+两周前+三周前)/4 平均 ,昨天/平均 比率
         from (
          select shopid, max(Case when trunc(r_date)=Trunc(sysdate)-1) 
                             then amount else 0 end) as 昨天 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-8)
                             then amount else 0 end) as 上周 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-15) 
                             then amount else 0 end) as 两周前 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-22)
                             then amount else 0 end) as 三周前 ,              
           from shopn_daystat 
           Where r_date>=Trunc(sysdate)-22 group by shopid
      ) a
      

  2.   

    Select shopid,昨天,上周,两周前,三周前,一月前,
          (昨天+上周+两周前+三周前)/4 平均 ,
           昨天/(昨天+上周+两周前+三周前)*4.0 比率
         from (
          select shopid, max(Case when trunc(r_date)=Trunc(sysdate)-1) 
                             then amount else 0 end) as 昨天 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-8)
                             then amount else 0 end) as 上周 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-15) 
                             then amount else 0 end) as 两周前 , 
                         max(Case when trunc(r_date)=Trunc(sysdate)-22)
                             then amount else 0 end) as 三周前 ,              
           from shopn_daystat 
           Where r_date>=Trunc(sysdate)-22 group by shopid
      ) a