Oracle Sql Sum / Subtraction查询

时间:2014-05-09 14:49:55

标签: sql oracle

我试图在Oracle中报告两个不同的事情。 PriorityNon-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 ;

1 个答案:

答案 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