SELECT M.JGMC AS CJDW,
SUM(T.LCZS) AS LCZS,
SUM(T.LCWCZS) AS LCWCZS,
SUM(T.LCWWCZS) AS LCWWCZS,
SUM(T.LCCSWCZS) AS LCCSWCZS,
SUM(T.LCWCSWCZS) AS LCWCSWCZS
FROM (SELECT (select JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM = A.CJDW) AS CJDW,
COUNT(*) AS LCZS,
COUNT(CASE
WHEN A.LCZT = 2 THEN
1
ELSE
NULL
END) LCWCZS,
COUNT(CASE
WHEN A.LCZT = 0 THEN
1
ELSE
NULL
END) LCWWCZS,
COUNT(CASE
WHEN A.LCZT = 2 AND
TO_DATE(LPAD(B.XDRQ, 8, '0') || LPAD(B.XDSJ, 6, '0'),
'YYYYMMDDHH24MISS') > SYSDATE THEN
1
ELSE
NULL
END) LCCSWCZS,
COUNT(CASE
WHEN A.LCZT = 2 AND
TO_DATE(LPAD(B.XDRQ, 8, '0') || LPAD(B.XDSJ, 6, '0'),
'YYYYMMDDHH24MISS') < SYSDATE THEN
1
ELSE
NULL
END) LCWCSWCZS
FROM EXT_LCJK_LC A, EXT_LCJK_LCHJMX B
WHERE A.LCID = B.LCID
AND TO_DATE(LPAD(B.DDRQ, 8, '0') || LPAD(B.DDSJ, 6, '0'),
'YYYYMMDDHH24MISS') =
(SELECT MAX(TO_DATE(LPAD(DDRQ, 8, '0') || LPAD(DDSJ, 6, '0'),
'YYYYMMDDHH24MISS'))
FROM EXT_LCJK_LCHJMX
WHERE LCID = B.LCID)
AND A.CJDW LIKE '17%'
AND A.CJRQ >= '20141101'
AND A.CJRQ <= '20141131'
GROUP BY A.CJDW) T,
(SELECT JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM LIKE '17%') M
WHERE T.CJDW(+) = M.JGMC
GROUP BY CJDW, M.JGMC

------解决思路----------------------
select * from table(dbms_xplan.display_cursor('sql_id',null,'advanced'));把全部的执行计划贴出来
------解决思路----------------------
语句方面优化空间还很大
1、最外层的GROUP BY CJDW, M.JGMC去掉
外层查询直接SELECT M.JGMC AS CJDW,T.LCZS,T.LCWCZS,T.LCWWCZS,T.LCCSWCZS,T.LCWCSWCZS
子查询中已经做完汇总了,外层再汇总就没啥必要了
2、 AND TO_DATE(LPAD(B.DDRQ, 8, '0')
------解决思路----------------------
LPAD(B.DDSJ, 6, '0'),
'YYYYMMDDHH24MISS') =
(SELECT MAX(TO_DATE(LPAD(DDRQ, 8, '0')
------解决思路----------------------
LPAD(DDSJ, 6, '0'),
'YYYYMMDDHH24MISS'))
FROM EXT_LCJK_LCHJMX
WHERE LCID = B.LCID)
这个条件可以考虑使用分析函数max()keep(dense_rank last order by)的方式实现,比表自身关联要快
3、通过cjdw获取JGMC这个没啥必要,保留原来的cjdw
SELECT (select JGMC FROM EXT_YX_SYS_JGXX WHERE JGBM = A.CJDW) AS CJDW,
改为select A.CJDW
外层关联条件改为T.CJDW(+) = M.JGBM
------解决思路----------------------
EXT_YX_SYS_JGXX 中jgbm和jgmc是一一对应的吧,使用jgmc关联和使用jgbm关联效果是一样的
名称在外层做外连接的时候使用M.JGMC就直接取出来了,外连接之前使用jgbm与cjdw关联就可以了