SELECT A.EMP_NO,
       A.CORP_CD,
       RNAME,
       D.DEPT_CD,
       TSYAIN_NAME,
       A.SYUGYO_MONTH,
       A.SYUGYO_DATE,
       A.SYUKKIN_YOKUTIME,
       A.SYUKKIN_TIME,
       A.SYUKKIN_DAKOKU_DATE,
       A.SYUKKIN_DAKOKU_TIME,
       A.SYUKKIN_DIFFERENCE_MINUTES,
       A.TAISYA_YOKUTIME,
       A.TAISYA_TIME,
       A.TAISYA_DAKOKU_DATE,
       A.TAISYA_DAKOKU_TIME,
       A.TAISYA_DIFFERENCE_MINUTES,
       A.SUM_DAYTIME,
       SYUKKIN_DIFFERENCE_MINUTES,
       TAISYA_DIFFERENCE_MINUTES,
       B.SUM_MINUTES,
   F.BIKO
  FROM (SELECT T.CORP_CD AS CORP_CD,
               T.EMP_NO AS EMP_NO,
                   CASE
                         WHEN TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'DD') >=1 THEN
                          TO_CHAR(ADD_MONTHS(TO_DATE(T.SYUGYO_DATE), 0), 'YYYY/MM')
                         ELSE
                          TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'YYYY/MM')
                       END AS SYUGYO_MONTH,
               SYUGYO_DATE,
               SYUKKIN_YOKUTIME AS SYUKKIN_YOKUTIME,
               SYUKKIN_TIME AS SYUKKIN_TIME,
               SYUKKIN_DAKOKU_DATE AS SYUKKIN_DAKOKU_DATE,
               SYUKKIN_DAKOKU_TIME AS SYUKKIN_DAKOKU_TIME,
               SYUKKIN_DIFFERENCE_MINUTES AS SYUKKIN_DIFFERENCE_MINUTES,
               TAISYA_YOKUTIME AS TAISYA_YOKUTIME,
               TAISYA_TIME AS TAISYA_TIME,
               TAISYA_DAKOKU_DATE AS TAISYA_DAKOKU_DATE,
               TAISYA_DAKOKU_TIME AS TAISYA_DAKOKU_TIME,
               TAISYA_DIFFERENCE_MINUTES AS TAISYA_DIFFERENCE_MINUTES,
               T.SYUKKIN_DIFFERENCE_MINUTES + T.TAISYA_DIFFERENCE_MINUTES AS SUM_DAYTIME
          FROM T_DAKOKU_DIFFERENCETIME T
           WHERE 1 = 1 
  AND SYUGYO_DATE >= '2011/06/01' AND SYUGYO_DATE <= '2011/06/30'    
    AND EMP_NO in ('S000006','S000001','020227','S000002','S000041','S000048','0007','S000008','S000040','S000042','S000043','S000044','S000045','S000007','S000092','S000030','S000046','S000085','S000086','S000090','S000091','S000096','S000031','S000047','S000003','S000098','S000013','S000049','S000100','0001','0002','0003','0004','0005','0006','0008','0009','0010','0011','0012','0013','0014','0015','0016','0017','0018','0019','0020','0021','0022','0023','0024','0025','0026','0027','0028','0029','0030','0031','1','10','100','1000','1001','1002','1003','1004','1005','1006','1007','1008','1009','101','1010','1011','1012','1013','1014','1015','1016','1017','1018','1019','102','1020','1021','1022','1023','1024','1025','1026','1027','1028','1029','103','1030','1031','1032','1033','1034','1035','1036','1037','1038','1039','104','1040','1041','1042','1043','1044','1045','1046','1047','1048','1049','105','1050','1051','1052','1053','1054','1055','1056','1057','1058','1059','106','1060','1061','1062','1063','1064','1065','1066','1067','1068','1069','107','1070','1071','1072','1073','1074','1075','1076','1077','1078','1079','108','1080','1081','1082','1083','1084','1085','1086','1087','1088','1089','109','1090','1091','1092','1093','1094','1095','1096','1097','1098','1099','11','110','1100','1101','1102','1103','1104','1105','1106','1107','1108','1109','111','1110','1111','1112','1113','1114','1115','1116','1117','1118','1119','112','1120','1121','1122','1123','1124','1125','1126','1127','1128','1129','113','1130','1131','1132','1133','1134','1135','1136','1137','1138','1139','114','1140','1141','1142','1143','1144','1145','1146','1147','1148','1149','115','1150','1151','1152','1153','1154','1155','1156','1157','1158','1159','116','1160','1161','1162','1163','1164','1165','1166','1167','1168','1169','117','1170','1171','1172','1173','1174','1175','1176','1177','1178','1179','118','1180','1181','1182','1183','1184','1185','1186','1187','1188','1189','119','1190','1191','1192','1193','1194','1195','1196','1197','1198','1199','12','120','1200','1201','1202','1203','1204','1205','1206','1207','1208','1209','121','1210','1211','1212','1213','1214','1215','1216','1217','1218','1219','122','1220','1221','1222','1223','1224','1225','1226','1227','1228','1229','123','1230','1231','1232','1233','1234','1235','1236','1237','1238','1239','124','1240','1241','1242','1243','1244','1245','1246','1247','1248','1249','125','1250','1251','1252','1253','1254','1255','1256','1257','1258','1259','126','1260','1261','1262','1263','1264','1265','1266','1267','1268','1269','127','1270','1271','1272','1273','1274','1275','1276','1277','1278','1279','128','1280','1281','1282','1283','1284','1285','1286','1287','1288','1289','129','1290','1291','1292','1293','1294','1295','1296','1297','1298','1299','13','130','1300','1301','1302','1303','1304','1305','1306','1307','1308','1309','131','1310','1311','1312','1313','1314','1315','1316','1317','1318','1319','132','1320','1321','1322','1323','1324','1325','1326','1327','1328','1329','133','1330','1331','1332','1333','1334','1335','1336','1337','1338','1339','134','1340','1341','1342','1343','1344','1345','1346','1347','1348','1349','135')                 
          ) A,--查询一个月的数据
       (
SELECT CORP,EMP_NO,SUM(SUM_MINUTES) AS SUM_MINUTES FROM (
SELECT CORP,
               EMP_NO,
               SUM(SYUKKIN_DIFFERENCE_MINUTES + TAISYA_DIFFERENCE_MINUTES) AS SUM_MINUTES --只根据emp_no和corp分组查询
          FROM (SELECT CORP_CD AS CORP,
                       EMP_NO,
                       CASE
                         WHEN TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'DD') >=1 THEN
                          TO_CHAR(ADD_MONTHS(TO_DATE(T.SYUGYO_DATE), 0), 'YYYY/MM')
                         ELSE
                          TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'YYYY/MM')
                       END AS SYUGYO_DATE,
                       T.SYUKKIN_DIFFERENCE_MINUTES,
                       T.TAISYA_DIFFERENCE_MINUTES
                  FROM T_DAKOKU_DIFFERENCETIME T
                 WHERE 1 = 1
                AND SYUGYO_DATE >= '2011/06/01' AND SYUGYO_DATE <= '2011/06/30'     

) M         GROUP BY M.SYUGYO_DATE, M.EMP_NO, CORP
         ORDER BY EMP_NO, M.SYUGYO_DATE  
)
having sum(SUM_MINUTES) > 20 --最关键的就是这里,如果符合这个条件,就把这个月的所有记录查出来
 GROUP BY EMP_NO, CORP
) B,--查询sum结果
       (SELECT NAME AS TSYAIN_NAME, MANNO AS EMP_NO, SADS AS SADS FROM TSYAIN
 WHERE 1 = 1 
        
        AND SDATE <= '2011/06/01'  AND EDATE >= '2011/06/30'   
     ) C,--取出姓名(NAME)和部门id(SADS)
       ( SELECT  NVL(RNAME,NAME) AS RNAME,CORP AS CORP,CODE AS DEPT_CD FROM MSZK ) D,--取出部门名(RNAME)
       (SELECT CORP, EMP_NO, M.SYUGYO_DATE AS SYUGYO_MONTH
          FROM (SELECT CORP_CD AS CORP,
                       EMP_NO,
                         CASE
                         WHEN TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'DD') >=1 THEN
                          TO_CHAR(ADD_MONTHS(TO_DATE(T.SYUGYO_DATE), 0), 'YYYY/MM')
                         ELSE
                          TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'YYYY/MM')
                       END  AS SYUGYO_DATE,
                       T.SYUKKIN_DIFFERENCE_MINUTES,
                       T.TAISYA_DIFFERENCE_MINUTES
                  FROM T_DAKOKU_DIFFERENCETIME T
                 WHERE 1 = 1
                AND SYUGYO_DATE >= '2011/06/01' AND SYUGYO_DATE <= '2011/06/30'                    
) M  GROUP BY M.SYUGYO_DATE, M.EMP_NO, CORP
         ORDER BY EMP_NO, M.SYUGYO_DATE
) E,--取出日期(SYUGYO_DATE)属于哪个月
   (
      SELECT TS.CORP_CD,TS.EMP_NO,TS.SYUGYO_DATE,TS.BIKO FROM T_SYUGYO_DETAIL_DAY TS
  WHERE 1 = 1
 AND SYUGYO_DATE >= '2011/06/01' AND SYUGYO_DATE <= '2011/06/30'                    
   ) F --取出备注(TS.BIKO)
 WHERE A.EMP_NO = B.EMP_NO
   AND A.EMP_NO = C.EMP_NO
   AND A.CORP_CD = D.CORP
   AND C.SADS = D.DEPT_CD
   AND A.EMP_NO = E.EMP_NO
   AND A.SYUGYO_MONTH = E.SYUGYO_MONTH
   AND C. EMP_NO = E.EMP_NO
   AND F.CORP_CD = D.CORP
   AND F.EMP_NO = E.EMP_NO
   AND F.SYUGYO_DATE = A.SYUGYO_DATE
   ORDER BY 
           SUM_MINUTES DESC,             
       EMP_NO ,
   A.SYUGYO_DATE
我再想是不是用了3次 CASE
                         WHEN TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'DD') >=1 THEN
                          TO_CHAR(ADD_MONTHS(TO_DATE(T.SYUGYO_DATE), 0), 'YYYY/MM')
                         ELSE
                          TO_CHAR(TO_DATE(T.SYUGYO_DATE), 'YYYY/MM')
                       END  AS SYUGYO_DATE 
而导致的问题?还是 EMP_NO in 的问题?

解决方案 »

  1.   

    --emp_no有那么多值,为何不使用not in呢?过滤相反的数据
    AND EMP_NO in ('S000006','S000001','020227','S000002','S000041','S000048','0007','S000008','S000040','S000042','S000043','S000044','S000045','S000007','S000092','S000030','S000046','S000085','S000086','S000090','S000091','S000096','S000031','S000047','S000003','S000098','S000013','S000049','S000100','0001','0002','0003','0004','0005','0006','0008','0009','0010','0011','0012','0013','0014','0015','0016','0017','0018','0019','0020','0021','0022','0023','0024','0025','0026','0027','0028','0029','0030','0031','1','10','100','1000','1001','1002','1003','1004','1005','1006','1007','1008','1009','101','1010','1011','1012','1013','1014','1015','1016','1017','1018','1019','102','1020','1021','1022','1023','1024','1025','1026','1027','1028','1029','103','1030','1031','1032','1033','1034','1035','1036','1037','1038','1039','104','1040','1041','1042','1043','1044','1045','1046','1047','1048','1049','105','1050','1051','1052','1053','1054','1055','1056','1057','1058','1059','106','1060','1061','1062','1063','1064','1065','1066','1067','1068','1069','107','1070','1071','1072','1073','1074','1075','1076','1077','1078','1079','108','1080','1081','1082','1083','1084','1085','1086','1087','1088','1089','109','1090','1091','1092','1093','1094','1095','1096','1097','1098','1099','11','110','1100','1101','1102','1103','1104','1105','1106','1107','1108','1109','111','1110','1111','1112','1113','1114','1115','1116','1117','1118','1119','112','1120','1121','1122','1123','1124','1125','1126','1127','1128','1129','113','1130','1131','1132','1133','1134','1135','1136','1137','1138','1139','114','1140','1141','1142','1143','1144','1145','1146','1147','1148','1149','115','1150','1151','1152','1153','1154','1155','1156','1157','1158','1159','116','1160','1161','1162','1163','1164','1165','1166','1167','1168','1169','117','1170','1171','1172','1173','1174','1175','1176','1177','1178','1179','118','1180','1181','1182','1183','1184','1185','1186','1187','1188','1189','119','1190','1191','1192','1193','1194','1195','1196','1197','1198','1199','12','120','1200','1201','1202','1203','1204','1205','1206','1207','1208','1209','121','1210','1211','1212','1213','1214','1215','1216','1217','1218','1219','122','1220','1221','1222','1223','1224','1225','1226','1227','1228','1229','123','1230','1231','1232','1233','1234','1235','1236','1237','1238','1239','124','1240','1241','1242','1243','1244','1245','1246','1247','1248','1249','125','1250','1251','1252','1253','1254','1255','1256','1257','1258','1259','126','1260','1261','1262','1263','1264','1265','1266','1267','1268','1269','127','1270','1271','1272','1273','1274','1275','1276','1277','1278','1279','128','1280','1281','1282','1283','1284','1285','1286','1287','1288','1289','129','1290','1291','1292','1293','1294','1295','1296','1297','1298','1299','13','130','1300','1301','1302','1303','1304','1305','1306','1307','1308','1309','131','1310','1311','1312','1313','1314','1315','1316','1317','1318','1319','132','1320','1321','1322','1323','1324','1325','1326','1327','1328','1329','133','1330','1331','1332','1333','1334','1335','1336','1337','1338','1339','134','1340','1341','1342','1343','1344','1345','1346','1347','1348','1349','135');--涉及到那么多表,可以考虑视图
      

  2.   

    ls的  not in  和 in 比较到底哪个效率高啊我本来的观念里是 能不 not in 就不用  能不 in 就不用in
    不过看到你  又是1又是2的  排名还那么前  弄的我没底了     请大拿解释解释 in 和 not in 的效率问题
    LZ  弱弱的问一句啊  你那么多子查询    每个里面都需要排序嘛把子查询的  order by 去掉吧