【LEFT JOIN 实战记录】是否纳入市级预算项目概览界面
【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
上一篇: 40多岁男老师如此搞笑
下一篇: 洛谷·拉格朗日差值2