我试图在Oracle中报告两个不同的事情。 Priority
和Non-Priority
。但是,Non-Priority
语句还包括Priority
语句中的计数。如何从Priority
计数中减去Non-Priority
计数?目前,结果是:
优先级: 3
非优先级: 84
但它应该是:
优先级: 3
非优先级: 81
Select x.*, y.*
from
(Select count(distinct archivedqueue.batchnum) "Priority"
from archivedqueue
inner join scanninglog
on scanninglog.batchnum = archivedqueue.batchnum
inner join itemdata
on itemdata.batchnum = archivedqueue.batchnum
inner join itemdata
on itemdata.batchnum = scanninglog.batchnum
where (ARCHIVEDQUEUE.DATESTARTED>=TO_DATE ('05-MAY-14')) -- Begin Date Range
and ARCHIVEDQUEUE.DATESTARTED<TO_DATE ('09-MAY-14') -- End Date Range
and (ARCHIVEDQUEUE.DATEENDED>=TO_DATE ('05-MAY-14')) -- Begin Date Range
and ARCHIVEDQUEUE.DATEENDED<TO_DATE ('09-MAY-14') -- End Date Range
and archivedqueue.usernum = '190'
and (archivedqueue.status = '8'
or scanninglog.actionnum = '8')
and (instr(itemdata.itemname, 'ANES OP') > 0
or instr(itemdata.itemname, 'TPN') > 0
or instr(itemdata.itemname, 'CODE BLUE') > 0))x ,
(Select count(distinct archivedqueue.batchnum) "Non-Priority"
from archivedqueue
inner join scanninglog
on scanninglog.batchnum = archivedqueue.batchnum
where (ARCHIVEDQUEUE.DATESTARTED>=TO_DATE ('05-MAY-14')) -- Begin Date Range
and ARCHIVEDQUEUE.DATESTARTED<TO_DATE ('09-MAY-14') -- End Date Range
and (ARCHIVEDQUEUE.DATEENDED>=TO_DATE ('05-MAY-14')) -- Begin Date Range
and ARCHIVEDQUEUE.DATEENDED<TO_DATE ('09-MAY-14') -- End Date Range
and archivedqueue.usernum = '190'
and (archivedqueue.status = '8'
or scanninglog.actionnum = '8')) Y ;
答案 0 :(得分:0)
您是否注意到1个查询中有2个类似的查询?总有一种更好的方法,通常是使用CASE语句。 :)
另外,您使用表ITEMDATA两次。但你加入相同的价值,所以一旦足够。请始终使用表别名来使您的生活更轻松。你可能已经发现了这一点。
修改:用类似&#39;%xx%&#39;替换了instr()。
Select count(distinct aq.batchnum) amount
, case when it.itemname like '%ANES OP%' then 'prio'
when it.itemname like '%TPN%' then 'prio'
when it.itemname like '%CODE BLUE%' then 'prio'
else 'non-prio'
end prio_type
from archivedqueue aq
join scanninglog sl on sl.batchnum = aq.batchnum
join itemdata it on it.batchnum = aq.batchnum
where aq.DATESTARTED >= TO_DATE('05-MAY-14') -- Begin Date Range
and aq.DATESTARTED < TO_DATE('09-MAY-14') -- End Date Range
and aq.DATEENDED >= TO_DATE('05-MAY-14') -- Begin Date Range
and aq.DATEENDED < TO_DATE('09-MAY-14') -- End Date Range
and aq.usernum = '190'
and (aq.status = '8' or sl.actionnum = '8')
group by case when it.itemname like '%ANES OP%' then 'prio'
when it.itemname like '%TPN%' then 'prio'
when it.itemname like '%CODE BLUE%' then 'prio'
else 'non-prio'
end