一个纵表变横表的优化过程

在一个已经实放的项目中,有一个纵表变横表的需求,实现代码如下:

 1
 2 select  a.FProjectNO, a.FProjectName,  2   as  FRegister, a.FRegisterDate  as  FInsertedDate,
 3         case  b02.FIsVised  when   1   then   2   else   0   end   as  FTrading,
 4         case  b03.FIsVised  when   1   then   2   else   0   end   as  FPlanChecking,
 5         case  b14.FIsVised  when   1   then   2   else   0   end   as  FTender,
 6         case  b06.FIsVised  when   1   then   2   else   0   end   as  FQuality,
 7         case  b05.FIsVised  when   1   then   2   else   0   end   as  FSafety,
 8         case  b07.FIsVised  when   1   then   2   else   0   end   as  FCost,
 9         case  b08.FIsVised  when   1   then   2   else   0   end   as  FAudit,
10         case  b09.FIsVised  when   1   then   2   else   0   end   as  FArrears,
11         case  b10.FApproveStatus  %   20    when   10   then   2   else   0   end   as  FLicence
12    from  PRO_BaseInfo a  left   outer   join
13        PRO_NodeStatus b02  on  b02.FProjectNO  =  a.FProjectNO  and  b02.FNodeID  =   11402   left   outer   join
14        PRO_NodeStatus b03  on  b03.FProjectNO  =  a.FProjectNO  and  b03.FNodeID  =   11403   left   outer   join
15        PRO_NodeStatus b14  on  b14.FProjectNO  =  a.FProjectNO  and  b14.FNodeID  =   11414   left   outer   join
16        PRO_NodeStatus b06  on  b06.FProjectNO  =  a.FProjectNO  and  b06.FNodeID  =   11406   left   outer   join
17        PRO_NodeStatus b05  on  b05.FProjectNO  =  a.FProjectNO  and  b05.FNodeID  =   11405   left   outer   join
18        PRO_NodeStatus b07  on  b07.FProjectNO  =  a.FProjectNO  and  b07.FNodeID  =   11407   left   outer   join
19        PRO_NodeStatus b08  on  b08.FProjectNO  =  a.FProjectNO  and  b08.FNodeID  =   11408   left   outer   join
20        PRO_NodeStatus b09  on  b09.FProjectNO  =  a.FProjectNO  and  b09.FNodeID  =   11409   left   outer   join
21        PRO_NodeStatus b10  on  b10.FProjectNO  =  a.FProjectNO  and  b10.FNodeID  =   11410
22    where  a.FStatus  =   70   and  a.FIsDeleted  =    0

此表记录每天以几何级数增长,结果是客户一再反映太慢。经过测试,确实慢,首次执行3分钟,再次执行3秒。

决定优化,代码如下:
select  a.FProjectNO, MAX (a.FProjectName),  2   as  FRegister,  MAX (a.FRegisterDate)  as  FInsertedDate,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11402   then   2   else   0   end as  FTrading,
       
MAX ( case   when  b.FIsVised  =   1   and  FNodeID  =   11403   then   2   else   0   end as  FPlanChecking,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11405   then   2   else   0   end as  FSafety,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11406   then   2   else   0   end as  FQuality,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11407   then   2   else   0   end as  FCost,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11408   then   2   else   0   end as  FAudit,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11409   then   2   else   0   end as  FArrears,
       
MAX ( case   when  b.FIsVised  =   1   AND  FNodeID  =   11414   then   2   else   0   end as  FTender,
       
MAX ( case   when  b.FApproveStatus  %   20   =   10   AND  FNodeID  =   11410   then   2   else   0   end as  FLicence
  
from  PRO_BaseInfo a 
left   outer   join     PRO_NodeStatus b  ON  b.FProjectNO  =  a.FProjectNO   
  
where  a.FStatus  =   70   and  a.FIsDeleted  =   0  
group   by  a.FProjectNO

执行结果为2秒,优化成功。

此思路为经老五再三埋汰的条件下指点而成。

开始时没有用Group,结果是多条记录。

这种方法以前用过,离代码远了,思路不开阔了。

转载于:https://www.cnblogs.com/Sabre/archive/2008/04/16/1156647.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值