【问题标题】:Passing a parameter to a join将参数传递给连接
【发布时间】:2014-05-07 15:00:51
【问题描述】:

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

我需要能够计算每个用户处于未结状态的订单数量、状态为“已退回”、“暂停”或“已退回 - 故障”的订单数量以及统计每个用户在各区的订单数。

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

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

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

【问题讨论】:

    标签: sql oracle join oracle11g parameter-passing


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 非常感谢您的回复。我使用 dbvisualizer 来执行 sql。我明白你的意思,好吧,明天我回到办公室并更新任何后续信息时,我会对此进行破解。
    • 在这个站点的变量部分你可以找到关于如何在 dbvisualizer 中绑定参数的描述:dbvis.com/doc/7.1/doc/ug/sqlCommander/… 它说你应该使用${notation}$,所以你的参数行应该是这样的:@987654326 @(我推荐使用to_date函数,这样你可以明确指定日期格式)。
    猜你喜欢
    • 2014-05-16
    • 2022-01-20
    • 2013-01-08
    • 2018-01-31
    • 2011-03-15
    • 2020-01-20
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多