将参数传递给连接

时间:2014-05-07 15:00:52

标签: sql oracle join oracle11g parameter-passing

我需要创建一个用于生成报告的视图。该视图将采用用户表,并根据用户ID和订单ID将订单表和工作流表连接起来。由于需要根据几种不同的订单状态加入订单表,因此视图很复杂。

我需要能够获得每个用户处于未结状态的订单数量,状态为"返回","暂停&#34的订单数量计数34;或者"返回 - 错误"以及每个用户每个区的订单数量。

将所有数据组合在一起很好我刚刚为每个计数要求设置了一个带连接的简单选择,如下所示。我的问题是,这将返回表中所有记录的计数,我需要能够在一定时间内将其限制为将被参数化的订单。

我需要一些帮助来获得对连接的时间限制。

select u.FIRST_NAME || ' ' || u.LAST_NAME as ASSIGNED_TO,
u.ID,
j4.TOTAL_AREA1,
j1.total,
j2.TOTAL_OPENED,
j3.TOTAL_RETURNED

from users u
left outer join
(      
 select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO,
        u1.ID,
        COUNT(o1.ORDER_KEY) as total
 from users u1,
  orders o1,
  WORKFLOW_WORKITEM ww1    

 where
        o1.ORDER_KEY = ww1.ENTITY_KEY_NUM
        AND ww1.ENTITY_NAME = 'Order'
        AND ww1.ASSIGNED_TO = U1.ID

 GROUP BY u1.FIRST_NAME,
        u1.LAST_NAME,
        u1.id) j1
on 
j1.ID = u.ID


left outer join 
(      
 select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO,
        u1.ID,
        COUNT(o1.ORDER_KEY) as TOTAL_OPENED
 from users u1,
      ORDERS o1,
      WORKFLOW_WORKITEM ww1    

 where
        o1.CASE_KEY = ww1.ENTITY_KEY_NUM
        AND ww1.ENTITY_NAME = 'Order'
        AND ww1.ASSIGNED_TO = U1.ID
        AND ww1.STATUS_CODE='S_ORD_CA_021'

 GROUP BY u1.FIRST_NAME,
        u1.LAST_NAME,
        u1.id) j2
on 
j2.ID = u.ID
left outer join 
(      
 select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO,
        u1.ID,
        COUNT(o1.ORDER_KEY) as TOTAL_RETURNED
 from users u1,
      ORDERS o1,

      WORKFLOW_WORKITEM ww1    

 where
        o1.ORDER_KEY = ww1.ENTITY_KEY_NUM
        AND ww1.ENTITY_NAME = 'Order'
        AND ww1.ASSIGNED_TO = U1.ID
        AND ww1.STATUS_CODE in ('S_ORD_CA_015', 'S_ORD_CA_016', 'S_ORD_CA_017','S_ORD_CA_018')

 GROUP BY u1.FIRST_NAME,
        u1.LAST_NAME,
        u1.id) j3
on 
j3.ID = u.ID


left outer join
(
select  
        u1.ID,
        COUNT(o1.ORDER_KEY) as TOTAL_AREA1

from    users u1,
        ORDERS o1,
        WORKFLOW_WORKITEM ww1,
        domains dm  

where
        o1.ORDER_KEY = ww1.ENTITY_KEY_NUM
        AND ww1.ENTITY_NAME = 'Order'
        AND ww1.ASSIGNED_TO = U1.ID
        and ww1.DOMAIN_ID=dm.ID
    AND dm.CODE='AREA1'

GROUP BY 
        u1.FIRST_NAME,
        u1.LAST_NAME,
        u1.id,
        ww1.DOMAIN_ID,
        dm.DESCRIPTION
       ) j4
on 
j4.ID = u.ID

1 个答案:

答案 0 :(得分:0)

基本上你想要添加类似的东西:

o1.DATE between :param_from and :param_to
每个订单中的

'子查询。 :notation是oracle参数的标准,但参数的绑定方式取决于用于执行查询的环境。所以请写下你使用的环境/工具。

您可以尝试简单地查询(我希望我没有做出任何语法错误,我在记事本中写了...):

select 
    ASSIGNED_USER, 
    UID, 
    count(AREA1) TOTAL_AREA1, 
    count(1) TOTAL,
    count(OPENED) TOTAL_OPENED,
    count (RETURNED) TOTAL_RETURNED
from
    (
    select 
        u1.id UID,
        u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_USER,
        case when dm.CODE='AREA1' then 1 else null end AREA1,
        case when ww1.STATUS_CODE='S_ORD_CA_021' then 1 else null end OPENED,
        case when ww1.STATUS_CODE in 
          ('S_ORD_CA_015', 'S_ORD_CA_016', 'S_ORD_CA_017','S_ORD_CA_018') then 1
            else null end RETURNED
    from users u1
        left outer join WORKFLOW_WORKITEM ww1 on AND ww1.ASSIGNED_TO = U1.ID
            AND ww1.ENTITY_NAME = 'Order'
        left outer join orders o1 on o1.ORDER_KEY = ww1.ENTITY_KEY_NUM
        left outer join domains dm on ww1.DOMAIN_ID=dm.ID
    where 
        o1.DATE between :param_from and :param_to
        -- you can add any other conditions that may 
        -- cut number of selected records
        -- to minimum required to get expected results
    )
group by UID, ASSIGNED_USER;