首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

这个sql有点长,大家来看看解决办法

2012-03-14 
这个sql有点长,大家来看看写了个查询,统计加班工时的,相信CSDN上有很多朋友都碰到过这样的问题,就是觉得有

这个sql有点长,大家来看看
写了个查询,统计加班工时的,相信CSDN上有很多朋友都碰到过这样的问题,
就是觉得有点长了,有点麻烦,用的是VB+Seagate   Crystal   Reports   ,每次都要5到10秒左右,大家讨论下,用什么方法简化下(版面有限,可能看起来有点费劲)
SELECT   SEC,PNL,NAME,INDATE,WK,WK_USE,WK_EUSE,WK1,WK2,WK3,WK4,WK5,WK6,WK7,WK8,WK9,WK10,WK11,WK12   FROM  
(SELECT   B.SEC,B.PNL,B.NAME,B.INDATE,C.WK,
(SUM(A.WK_OVER)+SUM(A.WK_HOLIDAY)+SUM(CASE   WHEN   A.IWEEK= '7 '   THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   )   )   AS   WK_USE,C.WK-(SUM(A.WK_OVER)+SUM(A.WK_HOLIDAY)+SUM(CASE   WHEN   A.IWEEK= '7 '   THEN   A.WK_STAND   ELSE   0   END   )   )   AS   WK_EUSE,
WK1=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070101 '   AND   '20070131 '   AND   A.IWEEK= '7 '     THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070101 '   AND   '20070131 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070101 '   AND   '20070131 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   )),
WK2=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070201 '   AND   '20070231 '   AND   A.IWEEK= '7 '     THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070201 '   AND   '20070231 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070201 '   AND   '20070231 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK3=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070301 '   AND   '20070331 '   AND   A.IWEEK= '7 '     THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070301 '   AND   '20070331 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070301 '   AND   '20070331 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK4=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070401 '   AND   '20070431 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070401 '   AND   '20070431 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070401 '   AND   '20070431 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK5=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070501 '   AND   '20070531 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070501 '   AND   '20070531 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070501 '   AND   '20070531 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,


WK6=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070601 '   AND   '20070631 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070601 '   AND   '20070631 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070601 '   AND   '20070631 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK7=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070701 '   AND   '20070731 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070701 '   AND   '20070731 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070701 '   AND   '20070731 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK8=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070801 '   AND   '20070831 '   AND   A.IWEEK= '7 '     THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070801 '   AND   '20070831 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070801 '   AND   '20070831 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK9=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070901 '   AND   '20070931 '   AND   A.IWEEK= '7 '     THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070901 '   AND   '20070931 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20070901 '   AND   '20070931 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK10=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071001 '   AND   '20071031 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071001 '   AND   '20071031 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071001 '   AND   '20071031 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,
WK11=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071101 '   AND   '20071131 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071101 '   AND   '20071131 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071101 '   AND   '20071131 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))   ,


WK12=(SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071201 '   AND   '20071231 '   AND   A.IWEEK= '7 '       THEN   A.WK_STAND   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071201 '   AND   '20071231 '       THEN   A.WK_OVER+A.WK_HOLIDAY   ELSE   0   END   )+SUM(CASE   WHEN   A.CAR_D   BETWEEN   '20071201 '   AND   '20071231 '   AND     A.IWEEK= '1 '   THEN   A.WK_STAND   ELSE   0   END   ))
FROM   WORKTIME   A   LEFT   OUTER   JOIN   PERSON   B   ON   A.FACT_NO=B.FACT_NO   AND   A.PNL=B.PNL   LEFT   OUTER   JOIN     (SELECT   FACT_NO,PNL,NAME,WK=CASE   WHEN   YEAR(INDATE)= '2006 '   THEN   '432 '   ELSE     ((datediff(dd,INDATE,dateadd(day,-1,convert(char(8),dateadd(month,1,INDATE),120)+ '1 '))-(7-datepart(weekday,INDATE)))/7+1)*8+(12-MONTH(INDATE))*36     END     FROM   PERSON   )   C
ON   A.FACT_NO=C.FACT_NO   AND   A.PNL=C.PNL   WHERE     LEFT(A.CAR_D,4)= '2007 '  
GROUP   BY   B.SEC,B.PNL,B.NAME,B.INDATE,C.WK)   A   WHERE   A.WK_EUSE> 0   ORDER   BY   SEC,PNL

[解决办法]
哇,这么长的SQL语句,牛人啊.
执行5到10秒也难免.
建议用临时表,或者把查询中的复杂计算先算出来,为表加一新列.
如这个子查询
SELECT FACT_NO,PNL,NAME,WK=CASE WHEN YEAR(INDATE)= '2006 ' THEN '432 ' ELSE ((datediff(dd,INDATE,dateadd(day,-1,convert(char(8),dateadd(month,1,INDATE),120)+ '1 '))-(7-datepart(weekday,INDATE)))/7+1)*8+(12-MONTH(INDATE))*36 END FROM PERSON

[解决办法]
5到10秒速度应该算正常

热点排行