求一个sql语句

Xiao_Ma123456789 2018-02-03 11:33:15
各位大神,您们好:

小弟做一个报表,遇到一个SQL语句不会写,求各位大侠不吝赐教!小弟在此提前拜谢了

需求:按照部门统计出订单的数量,并按照截止日期和系统日期进行比较,大于系统日期的为异常数据。小于系统日期的为正常数据。但是现在的情况是有些部门查询出的数据只有正常或者只有异常的数据,这样对我报表显示就会有问题。我想如果没有异常数据的话就拼个0出来。
另外部门并非固定的,得从MRP_WO_V这个视图里统计出来。
下面是我写的SQL语句,其中【:p1】,【:p2】为外部传入的参数,分别代表年和月

具体需求如下图:最下面的3个部门数据不成对,我想拼接一下改怎么改造我的SQL语句


select a.order_quantity,a.deptname,a.status from(

select count(mv.id) order_quantity,hr.deptname,'exception' status from mrp_wo_v left join hr_dept hr on mv.Manufact_Hr_dept_id = hr.id
where mv.plan_end_date > sysdate and substr(mv.wo_date_str,0,4)=:p1 and substr(mv.wo_date_str,5,2)=:p2
group by hr.dept_name

union

select count(mv.id) order_quantity,hr.deptname,'normal' status from mrp_wo_v left join hr_dept hr on mv.Manufact_Hr_dept_id = hr.id
where mv.plan_end_date < sysdate and substr(mv.wo_date_str,0,4)=:p1 and substr(mv.wo_date_str,5,2)=:p2
group by hr.dept_name

) a order by a.dept_name,a.status

...全文
599 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xiao_Ma123456789 2018-02-08
  • 打赏
  • 举报
回复
引用 6 楼 liuzhijian2008x 的回复:
[quote=引用 5 楼 Xiao_Ma123456789 的回复:] [quote=引用 4 楼 liuzhijian2008x 的回复:] 稍微改改:1、用部门表左连接订单表。 2、 条件不要放在where后面。如下: select a.order_quantity, a.deptname, a.status from ( select count(mv.id) order_quantity, hr.deptname, 'exception' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date > sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname union all select count(mv.id) order_quantity, hr.deptname, 'normal' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date < sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname ) a order by a.deptname, a.status;
好像还是有点问题,这样的写法,具体如下图片 [/quote] 不是right join是left join [/quote] 帅哥,不是left join 或者right join 的问题,如果用left join 每次在SQL DEVELOPER里执行都会报错,【无法连接】,不知道什么鬼,改到right join没有问题查询没有问题,后来发现是时间判断的问题,因为是去年12月的单子,所以所有的plan_end_date都小于sysdate了,没办法出现normal的数据了,该怎么拼这里?
  • 打赏
  • 举报
回复
纠正一下昨天犯得错误 --字段重新命名,最好加上个as --左连接,连接的字段组合起来必须是右边表的主键,即通过连接字段能够在右边表查询得到唯一一行数据 --with 作为临时表,复用性好一些,也利于逻辑上的观察,但是在复用的过程中,要发现细微的差别 WITH AS dateStatus(--昨天想当然用错了主键,应该以部门名称作为主键 SELECT t.deptname,t1.status FROM( SELECT deptname FROM hr_dept GROUP BY deptname ) LEFT JOIN( SELECT 'exception' AS status FROM dual UNION ALL SELECT 'normal' AS status FROM dual ) ON(1=1)--这样能产生笛卡尔积 ), WITH AS mrp_mv( SELECT --主要是为了将 plan_end_date转化为 status mv.id, CASE WHEN mv.plan_end_date>SYSDATE THEN 'exception' ELSE NORMAL END AS status FROM mrp_wo_v mv ) ----------------------------------------- SELECT COALESCE(t1.order_quantity,0) AS order_quantity t.deptname, t.status FROM datestatus t LEFT JOIN( SELECT COUNT(mv.id) AS order_quantity, hr.deptname, mv.status FROM mrp_mv mv LEFT JOIN hr_dept hr ON( hr.id=mv.manufact_hr_dept_id ) WHERE SUBSTR(mv.wo_date_str,0,4)=:p1 AND SUBSTR(mv.wo_date_str,5,2)=:p2 GROUP BY hr.dept_name, mv.status ) t1 ON( t1.deptname=t.deptname )
  • 打赏
  • 举报
回复
--字段重新命名,最好加上个as --左连接,连接的字段组合起来必须是右边表的主键,即通过连接字段能够在右边表查询得到唯一一行数据 --with 作为临时表,复用性好一些,也利于逻辑上的观察,但是在复用的过程中,要发现细微的差别 WITH AS dateStatus( SELECT 'exception' AS status FROM dual UNION ALL SELECT 'normal' AS status FROM dual ), WITH AS mrp_mv( SELECT --主要是为了将 plan_end_date转化为 status mv.id, CASE WHEN mv.plan_end_date>SYSDATE THEN 'exception' ELSE NORMAL END AS status FROM mrp_wo_v mv ) ----------------------------------------- SELECT COALESCE(t.order_quantity,0) AS order_quantity t.deptname, t.status FROM datestatus t LEFT JOIN( SELECT COUNT(mv.id) AS order_quantity, hr.deptname, mv.status FROM mrp_mv mv LEFT JOIN hr_dept hr ON( hr.id=mv.manufact_hr_dept_id ) WHERE SUBSTR(mv.wo_date_str,0,4)=:p1 AND SUBSTR(mv.wo_date_str,5,2)=:p2 GROUP BY hr.dept_name, mv.status ) t1 ON( t1.status=t.status )
  • 打赏
  • 举报
回复
楼主是想需要一行数据能同时显示正常,和异常情况吧,可以把想要的列用excel表示出来,另外比较的时间只比较到月就行了吗?获取得到的年,月都是字符串形式吧,在自己数据库的时间格式是字符串格式还是日期格式,格式标准是'yyyy-mm-dd'吗?
liu志坚 2018-02-07
  • 打赏
  • 举报
回复
引用 5 楼 Xiao_Ma123456789 的回复:
[quote=引用 4 楼 liuzhijian2008x 的回复:]
稍微改改:1、用部门表左连接订单表。 2、 条件不要放在where后面。如下:
select a.order_quantity, a.deptname, a.status
from (

select count(mv.id) order_quantity, hr.deptname, 'exception' status
from hr_dept hr
left join mrp_wo_v mv
on mv.Manufact_Hr_dept_id = hr.id
and mv.plan_end_date > sysdate
and substr(mv.wo_date_str, 0, 4) = '2018'
and substr(mv.wo_date_str, 5, 2) = '02'

group by hr.deptname

union all

select count(mv.id) order_quantity, hr.deptname, 'normal' status
from hr_dept hr
left join mrp_wo_v mv
on mv.Manufact_Hr_dept_id = hr.id
and mv.plan_end_date < sysdate
and substr(mv.wo_date_str, 0, 4) = '2018'
and substr(mv.wo_date_str, 5, 2) = '02'
group by hr.deptname

) a
order by a.deptname, a.status;

好像还是有点问题,这样的写法,具体如下图片

[/quote]

不是right join是left join

Xiao_Ma123456789 2018-02-07
  • 打赏
  • 举报
回复
引用 4 楼 liuzhijian2008x 的回复:
稍微改改:1、用部门表左连接订单表。 2、 条件不要放在where后面。如下: select a.order_quantity, a.deptname, a.status from ( select count(mv.id) order_quantity, hr.deptname, 'exception' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date > sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname union all select count(mv.id) order_quantity, hr.deptname, 'normal' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date < sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname ) a order by a.deptname, a.status;
好像还是有点问题,这样的写法,具体如下图片
liu志坚 2018-02-05
  • 打赏
  • 举报
回复
稍微改改:1、用部门表左连接订单表。 2、 条件不要放在where后面。如下: select a.order_quantity, a.deptname, a.status from ( select count(mv.id) order_quantity, hr.deptname, 'exception' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date > sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname union all select count(mv.id) order_quantity, hr.deptname, 'normal' status from hr_dept hr left join mrp_wo_v mv on mv.Manufact_Hr_dept_id = hr.id and mv.plan_end_date < sysdate and substr(mv.wo_date_str, 0, 4) = '2018' and substr(mv.wo_date_str, 5, 2) = '02' group by hr.deptname ) a order by a.deptname, a.status;
lxz19901212 2018-02-05
  • 打赏
  • 举报
回复
改为full join,然后用decode转化出 exception 和 normal,然后外层group by 即可
Xiao_Ma123456789 2018-02-03
  • 打赏
  • 举报
回复
感觉上个图片不清晰,从新上传一个,不知道这个怎么样
songxin9909 2018-02-03
  • 打赏
  • 举报
回复
请重新上传个图片,能看清楚SQL语句的~

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧