Sql 将参数传递给联接
我需要创建一个用于生成报告的视图。该视图将获取一个用户表,并根据用户ID和订单ID将其与一个订单表和一个工作流表连接起来。由于我需要根据两个不同的订单状态多次连接订单表,因此该视图非常复杂 我需要能够获得每个用户打开状态的订单数量计数,状态为“已退回”、“保留”或“已退回-故障”的订单数量计数,以及每个用户在每个地区的订单数量计数 把所有的数据放在一起是很好的,我刚刚设置了一个简单的select,为每个计数要求建立了一个连接,如下所示。我的问题是,这将返回表中所有记录的计数,并且我需要能够将其限制为将参数化的特定时间内的订单 我需要一些帮助来获得连接的时间限制Sql 将参数传递给联接,sql,oracle,join,oracle11g,parameter-passing,Sql,Oracle,Join,Oracle11g,Parameter Passing,我需要创建一个用于生成报告的视图。该视图将获取一个用户表,并根据用户ID和订单ID将其与一个订单表和一个工作流表连接起来。由于我需要根据两个不同的订单状态多次连接订单表,因此该视图非常复杂 我需要能够获得每个用户打开状态的订单数量计数,状态为“已退回”、“保留”或“已退回-故障”的订单数量计数,以及每个用户在每个地区的订单数量计数 把所有的数据放在一起是很好的,我刚刚设置了一个简单的select,为每个计数要求建立了一个连接,如下所示。我的问题是,这将返回表中所有记录的计数,并且我需要能够将其限
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
基本上,您希望添加以下内容:
o1.DATE between :param_from and :param_to
在每个“订单”子查询中<代码>:符号是oracle参数的标准,但参数的绑定方式取决于执行查询所使用的环境。因此,请写下您使用的环境/工具
您可以尝试简化查询(我希望我没有犯任何语法错误,我是在记事本中写的…):
非常感谢您的回复。我正在使用dbvisualizer执行sql。我明白你的意思了,好吧,我明天回到办公室后会对此进行破解,并进行后续更新。在这个网站的变量部分,你可以找到关于如何在dbvisualizer中绑定参数的描述:它说你应该使用
${notation}$
,所以您的参数行应该是这样的:o1.DATE介于to_DATE(${param_from}$,'YYYY-MM-DD')和to_DATE(${param_to}$,'yyyyy-MM-DD')
(我建议使用to_DATE
函数,这样您就可以明确指定日期格式)。
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;