如下SQL需查找并统计年假未休请协助修改,
并优化oracle如下SQL性能,提高执行效率和减少资源占用:
WITH V_DATA AS(
SELECT HCP.SF_LSHR_NO_GET(A.EMP_CODE,19) WORK_PLACE,
A.EMP_CODE,A.EMP_NAME,A.ANNUAL_LEAVE,A.YEAR
FROM HCP.v_clk_tz_annual_leave A
WHERE annual_leave>0
AND YEAR = 2025 --AND EMP_CODE='TZ143941'
--AND ((TO_CHAR(SYSDATE, 'mm') IN ('04', '05', '06', '07', '08', '09') AND
-- TRUNC(SYSDATE) IN
-- (SELECT MAX(B.A)
-- FROM (SELECT TRUNC(SYSDATE, 'mm') + ROWNUM - 1 A
-- FROM DBA_OBJECTS
-- WHERE ROWNUM < 32) B
-- WHERE TO_CHAR(B.A, 'day') = 'friday ')) OR
-- (TO_CHAR(SYSDATE, 'mm') IN ('10', '11') AND
-- TO_CHAR(SYSDATE, 'Day') = 'Friday ') OR
-- TO_CHAR(SYSDATE, 'mm') = '12')
),
DEPT_PEOPLE AS(
SELECT EMP_CODE,MEANING,HCP.SF_LSHR_NO_GET(MEANING, 8) V_EMAIL FROM (
SELECT T.EMP_CODE,MEANING,ROWNUM FROM V_DATA T
JOIN HCP.KS_LOOKUP_VALUE KLV
ON (KLV.REVERSE2 = SUBSTR(HCP.SF_LSHR_NO_GET(T.EMP_CODE, 15), LENGTH(HCP.SF_LSHR_NO_GET(T.EMP_CODE, 15))-5)
OR KLV.REVERSE2 = HCP.SF_LSHR_NO_GET(T.EMP_CODE, 2))
WHERE KLV.LOOKUP_TYPE = 'DEPT_PEOPLE'
AND KLV.ENABLED = 'Y'
ORDER BY KLV.REVERSE2 DESC)
WHERE ROWNUM = 1
),
V_CNT AS(
SELECT DECODE(HPB.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', HPB.WORK_PLACE) AS PLANT,
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 14) DIV,
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 15) DEPT_NAME,
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 13) CLASS_NAME,
COUNT(HPB.EMP_CODE) UNPEOPLE,
SUM(HPB.ANNUAL_LEAVE) UNDAY,
L.V_EMAIL || ';' ||
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 9), 8) AS TOEMAIL,
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 10), 8) || ';' ||
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 11), 8) AS CCEMAIL
FROM V_DATA HPB JOIN DEPT_PEOPLE L ON HPB.EMP_CODE=L.EMP_CODE
GROUP BY DECODE(HPB.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', HPB.WORK_PLACE),
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 14),
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 15),
HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 13),
L.V_EMAIL || ';' ||
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 9), 8),
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 10), 8) || ';' ||
HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(HPB.EMP_CODE, 11), 8)
UNION ALL
SELECT '合计', '', '', '', UNPEOPLE, UNDAY, '', ''
FROM (SELECT COUNT(EMP_CODE) UNPEOPLE,
SUM(ANNUAL_LEAVE) UNDAY
FROM V_DATA)
WHERE UNDAY IS NOT NULL
)
SELECT PLANT 厂区,
DIV 处级,
DEPT_NAME 部门名称,
CLASS_NAME 课别名称,
UNPEOPLE 未休人数,
UNDAY 未休天数,
TOEMAIL,
CCEMAIL
FROM V_CNT
ORDER BY PLANT, DIV, DEPT_NAME, CLASS_NAME;
最新发布