您的位置:首页 > 其它

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

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

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

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

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

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

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

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

业务说明:

项目表(Project) 、事项表(Problem)、全行业事项表(Industy)

1.项目表(Project)

通过项目类型字段(project_type)分为:一般项目、全行业项目、全行业子项目(与全行业项目存在上下级关系)

2.事项表(Problem)

项目表与事项表存在 一对多的关系,一般项目与全行业子项目的事项均存放在此处

3.全行业事项表(Industy)

全行业项目与全行业事项表也存在一对多的关系

--应客户要求使用的国产达梦数据库
--未合并一般事项和全行业事项
select
pj.project_uuid as projectUuid,
pj.project_name as projectName,
count(pb.problem_uuid) as problemNum,
--利用case when 进行数据条件过滤  此次使用count(NULL)并非count(0)
count
(
case when FINALLY_CHECK_STATE>0 then 1 else null end
)
cancleNum,
--因为偷懒 直接利用case when 嵌套另一个case when ,其实也可以通过 select *, case when xxx as rectifyRatio from (这条sql)
--convert(Float,XX)方便得出一个百分比的结果 rectifyRatio
case when count(1)=0 then 0
else
CONVERT(FLOAT,count( case when FINALLY_CHECK_STATE >0 then 1 else null end))/CONVERT(FLOAT,count(1))
end as rectifyRatio,
count
(
case when pb.budget=1 then 1 else null end
)
budgetNum
from
cqrectify.problem pb
right join
cqrectify.project pj
on
pb.project_uuid =pj.project_uuid
where
--展示出一般项目与全行业项目(全行业子项目展示是通过点击图中小模块,ajax调用另外一条sql,并将结果拼接在对应全行业项目下方)
pj.project_type != 2
group by
pj.project_uuid,
pj.project_nam




需求改动内容

之前只需要关联事项表(Problem),查询出其中的事项总数等数据

现在变更为:一般项目与全行业子项目 关联 事项表(Problem)

全行业项目 关联 全行业事项表(Industry)

新需求造成的主要问题:全行业项目,全行业子项目,一般项目 是通过一个字段 project_type 来区分的,如何在改动sql最少或改动代码最少的情况下,实现新的需求。

个人想法

1.结果拼凑法:原sql不改变,再加入一条sql,先遍历原sql的结果集,取出属于全行业项目的主键,放入新加的sql里,得出另外一个结果集,最后合并结果集。

优点:无脑输出,实现简单 缺点:代码繁琐,效率低

2.通过union函数,1条sql 查出 一般项目关联事项表(problem),另外一条sql查出 全行业项目 关联全行业事项表(industry),两条sql输出同样的结果集,最后通过union合并。

( 暂时还没有想到更好的解决方法,欢迎大佬们补充!!!)

--合并以后
select
pj.project_uuid as projectUuid,
pj.project_name as projectName,
count(pb.problem_uuid)               as problemNum,
count
(
case when FINALLY_CHECK_STATE>0 then 1 else null end
)
cancleNum,
case when count(1)=0 then 0 else CONVERT(FLOAT,count(
case                 when FINALLY_CHECK_STATE             >0 then 1 else null end))/CONVERT(FLOAT,count(1)) end as rectifyRatio
from
cqrectify.problem pb
right join
cqrectify.project pj
on
pb.project_uuid =pj.project_uuid
where
pj.project_type ==0
group by
pj.project_uuid,
pj.project_name
union
select
pj.project_uuid as projectUuid,
pj.project_name as projectName,
count(pb.industry_uuid)                 as problemNum,
count
(
case when RECTIFY_STATE>0 then 1 else null end
)
cancleNum,
case when count(1)=0 then 0 else CONVERT(FLOAT,count(
case                 when RECTIFY_STATE       >0 then 1 else null end))/CONVERT(FLOAT,count(1)) end as rectifyRatio
from
cqrectify.industry pb
right join
cqrectify.project pj
on
pb.project_uuid =pj.project_uuid
where
pj.project_type = 1
group by
pj.project_uuid,
pj.project_name
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: