您的位置:首页 > 其它

【LEFT JOIN 实战记录】统计查询-问题明细指标查询

2017-11-01 16:40 561 查看
【LEFT JOIN 实战记录】统计查询-问题明细指标查询

【LEFT JOIN 实战记录】统计查询-整改事项查询(多表联合查询+多次左连接字典表)

【LEFT JOIN 实战记录】统计查询-按主办处室区县查询纳入分析研判库

【LEFT JOIN 实战记录】是否纳入市级预算项目概览界面

【LEFT JOIN 入门级实践】项目表与组织表与人员表,其中人员存在上下级关系

【LEFT JOIN 入门级实践】MYSQL 简单实现 ORACLE minus 差集函数

如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句

--利用ROWNUM,实现序列号的展示
SELECT ROWNUM AS NUM,*,
--计算百分比时,如果分母存在可以能为0的状态时,可以通过NUllIF(X,Y)函数来避免
--NULLIF(X,Y) 当X=Y时,为NULL,否则为 X
SELECT ROWNUM AS NUM,*,
TO_NUMBER(RECTIFY_COUNT)/NULLIF(TO_NUMBER(ALL_PROBLEM_COUNT),0) AS RECTIFY_RATE,
TO_NUMBER(CAN_RECTIFY_COUNT)/NULLIF(TO_NUMBER(ALL_CAN_RECTIFY_COUNT),0) AS CAN_RECTIFY_RATE,
(PROMOTE_MONEY_CASH+SAVINGS_AMOUNT)/NULLIF(DEAL_MONEY,0) AS DEC_REPORT_RECTIFY_RATE
FROM (SELECT
D.CODE_NAME,
COUNT(P.PROBLEM_UUID) AS ALL_PROBLEM_COUNT,
COUNT(CASE WHEN<
4000
/span> P.UNRECTIFY_REASON = '00030003' THEN NULL ELSE 1 END) AS ALL_CAN_RECTIFY_COUNT,
COUNT
(
CASE WHEN (P.FINALLY_CHECK_STATE='1' OR P.FINALLY_CHECK_STATE='2' OR P.FINALLY_CHECK_STATE='3') AND P.UNRECTIFY_REASON != '00030003' THEN 1 ELSE NULL END
) AS CAN_RECTIFY_COUNT,
COUNT
(
CASE WHEN P.FINALLY_CHECK_STATE='1' OR P.FINALLY_CHECK_STATE='2' OR P.FINALLY_CHECK_STATE='3' THEN 1 ELSE NULL END
) AS RECTIFY_COUNT,
COUNT
(
CASE WHEN P.FINALLY_CHECK_STATE='2' THEN 1 ELSE NULL END
) AS RECTIFY_2_COUNT,
COUNT
(
CASE WHEN P.FINALLY_CHECK_STATE='1' THEN 1 ELSE NULL END
) AS RECTIFY_1_COUNT,
COUNT
(
CASE WHEN P.FINALLY_CHECK_STATE='3' THEN 1 ELSE NULL END
) AS RECTIFY_3_COUNT,
--将varchar型转换为number后,在SUM求和
SUM(TO_NUMBER(P.DEAL_MONEY)) AS DEAL_MONEY,
SUM(TO_NUMBER(P.PROMOTE_MONEY_CASH)) AS PROMOTE_MONEY_CASH,
SUM(TO_NUMBER(F.SAVINGS_AMOUNT)) AS SAVINGS_AMOUNT

FROM
--此处查询分组数据,按各个表分组
--LPAD函数,左补位
--详细链接:https://www.2cto.com/database/201112/115416.html
--此处补位的原因是因为,在字典表中,问题类型存在 一,二,三级的“同名”的情况,例如“其他”,1,2,3级均有。
--同名的情况下,按名字来分组,导致只能展现出一条数据,所以通过给不同等级的名称左补位来区分
--通过判断LENGTH(code_value)/3的值来补位
(SELECT CODE_VALUE,LPAD(CODE_NAME,LENGTH(CODE_VALUE)/3+LENGTH(CODE_NAME),' -') AS CODE_NAME FROM CODE_INFO WHERE DATA_SORT_UUID = '00004'  AND IS_DEL = '0' ORDER BY CODE_VALUE) D
LEFT JOIN
--TODO 此处未考虑全行业项目事项
(SELECT PROBLEM_UUID,PROBLEM_NAME, BUDGET_YEAR, DOCUMENT_TYPE,
RESPONSIBILITY_SUBJECT, RECTIFY_STATE, OVERDUE, METHOD, UNRECTIFY_REASON_REMARK,
UNRECTIFY_REASON, SITUATION_PLAN, REMARK, ANALYSIS_TAG, ANALYSIS_REASON, FIRST_CHECK_TAG,
PROBLEM_NATURE, DETAILED, AMOUNT, UNIT, HANDLE_SITUATION, DEAL_MONEY, DURING_AUDIT_MONEY,
PROMOTE_MONEY, PROMOTE_MONEY_CASH,  FINALLY_CHECK_STATE,  PROBLEM_NATURE_NAME, DETAILED_NAME,
PRJ.PROJECT_UUID,PLAN_YEAR,PROJECT_NAME,OFFICESID,PROJECT_CLASSIFICATION FROM PROJECT PRJ
LEFT JOIN PROBLEM ON PROBLEM.PROJECT_UUID = PRJ.PROJECT_UUID
WHERE PRJ.IS_DEL = '0' AND PROBLEM.IS_DEL   = '0'
) P
ON
P.DETAILED LIKE '%'||D.CODE_VALUE||'%'
AND (P.OFFICESID = ? OR '' = ? )
AND (P.DOCUMENT_TYPE = ? OR '' = ? )
AND (P.PROJECT_CLASSIFICATION = ? OR '' = ? )
AND (P.PLAN_YEAR = ? OR '' = ? )
LEFT JOIN FOLLOWUP F
ON F.PROBLEM_UUID = P.PROBLEM_UUID
--后续填报事项表(Followup),事项表与后续填报事项表存在1对多关系,通过VERSION版本号来区分
--MAX函数找出对应事项表关联得后续填报事项表中最高版本,并将值返回给查询条件(F.version=X)
--F.version is null 代表只首次填报了,还未开始后续填报或不需要后续填报的情况
AND (F.VERSION = (SELECT TO_CHAR(MAX(TO_NUMBER(VERSION))) FROM FOLLOWUP WHERE FOLLOWUP.PROBLEM_UUID = P.PROBLEM_UUID) OR F.VERSION IS NULL)
WHERE 1=1
AND (D.CODE_NAME LIKE '%'||?||'%' OR '' = ? )
AND  (? LIKE '%'||(LENGTH(D.CODE_NAME))||'%' OR '' = ? )
GROUP BY
D.CODE_VALUE,
D.CODE_NAME)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: