我需要创建一个子句来限制返回的数据。
如果来自PO_headers_all的AUTHORIZATION_STATUS返回STATUS'已批准'和'正在处理',则不返回供应商。然而,它自己返回“已批准”我需要退回供应商。
这样做的目的是让那些没有优秀PO的供应商退回。
有没有办法做到这一点?
Select
company,
vendor_site_code,
vendor_name,
segment1,
Site_Type,
Max_Invoice_Date,
TEST
From
(
select
inv.org_id company,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
inv.org_id,
-- CASE WHEN pha.AUTHORIZATION_STATUS IN ( 'APPROVED', 'IN PROCESS') THEN 'ACTIVE'
-- ELSE 'IN ACTIVE' end AS TEST,
ps.pay_group_lookup_code AS Site_Type,
MAX (inv.gl_date) AS Max_Invoice_Date,
1 As unit_
from ap_invoices_all inv,
po_vendors pv,
po_vendor_sites_all ps,
PO_headers_all pha
where inv.vendor_id = pv.vendor_id
and pv.vendor_id = ps.vendor_id
and inv.vendor_site_id = ps.vendor_site_id
and pha.vendor_id = pv.vendor_id
and inv.org_id in (174,169,172)
and ps.inactive_date is null
and pv.END_DATE_ACTIVE is null
GROUP BY
inv.org_id,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
ps.pay_group_lookup_code,
inv.org_id,
--CASE WHEN pha.AUTHORIZATION_STATUS IN ( 'APPROVED', 'IN PROCESS') THEN 'ACTIVE'
-- ELSE 'IN ACTIVE' end
ORDER BY vendor_name DESC
)
WHERE
Max_Invoice_Date < TRUNC(ADD_MONTHS( SYSDATE, -12 ),'MONTH')
示例输出如下;
172|UMANIS.201|UMANIS|COMPUTER|12988|EXPENSE|24-NOV-11|APPROVED
172|UMANIS.201|UMANIS|COMPUTER|12988|EXPENSE|24-NOV-11|IN PROCESS
如果结果如上所述,我想排除供应商。
答案 0 :(得分:0)
好的,让我们潜入。
但首先是指向How to create a Minimal, Complete, and Verifiable example
的必要指针您可以在此答案中找到(并希望,更正,完整并添加到您的问题中)此类示例的尝试(也在rextester上)。这个例子可以大大简化,因为许多领域并不真正与你的核心问题有关(&#34;我如何过滤记录,其中条件是另一个表中存在两个相关记录?&#34; )但是根据您的具体业务要求。
我决定不简化任何事情,因为我希望能够完全测试您提出的问题。
我尝试从查询和示例输出中重新创建您所说的示例数据。
我创建了2个供应商:UMANIS(其标题状态包含&#34; APPROVED&#34;&#34; IN PROCESS&#34;因此应该被过滤掉)和ROBOZ(其中标题状态仅包含&#34; APPROVED&#34;因此应该返回)。
create table ap_invoices_all (
org_id integer,
gl_date date,
vendor_id integer,
vendor_site_id integer
);
insert into ap_invoices_all (org_id, gl_date, vendor_id, vendor_site_id)
values (172 , to_date('2015-04-27','YYYY-MM-DD'), 111, 201);
insert into ap_invoices_all (org_id, gl_date, vendor_id, vendor_site_id)
values (172 , to_date('2015-03-11','YYYY-MM-DD'), 222, 301);
create table po_vendors (
vendor_name varchar2(20),
segment1 varchar2(20),
vendor_id integer,
end_date_active date
);
insert into po_vendors (vendor_id, vendor_name, segment1, end_date_active)
values (111, 'UMANIS','SEGM1',null);
insert into po_vendors (vendor_id, vendor_name, segment1, end_date_active)
values (222, 'ROBOZ','SEGM1',null);
create table po_vendor_sites_all (
vendor_site_code varchar2(20),
pay_group_lookup_code varchar2(20),
vendor_id integer,
vendor_site_id integer,
inactive_date date
);
insert into po_vendor_sites_all (vendor_id, vendor_site_id, vendor_site_code, pay_group_lookup_code, inactive_date)
values (111, 201, 'UMANIS.201', 'EXPENSE',null);
insert into po_vendor_sites_all (vendor_id, vendor_site_id, vendor_site_code, pay_group_lookup_code, inactive_date)
values (222, 301, 'ROBOZ.301', 'EXPENSE',null);
create table po_headers_all (
vendor_id integer,
AUTHORIZATION_STATUS varchar2(20)
);
insert into po_headers_all (vendor_id, AUTHORIZATION_STATUS)
values (111, 'APPROVED');
insert into po_headers_all (vendor_id, AUTHORIZATION_STATUS)
values (111, 'IN PROCESS');
insert into po_headers_all (vendor_id, AUTHORIZATION_STATUS)
values (222, 'APPROVED');
-- Original query
Select
company,
vendor_site_code,
vendor_name,
segment1,
Site_Type,
Max_Invoice_Date,
TEST
From
(
select
inv.org_id company,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
inv.org_id,
CASE WHEN pha.AUTHORIZATION_STATUS IN ( 'APPROVED', 'IN PROCESS') THEN 'ACTIVE'
ELSE 'IN ACTIVE' end AS TEST,
ps.pay_group_lookup_code AS Site_Type,
MAX (inv.gl_date) AS Max_Invoice_Date,
1 As unit_
from ap_invoices_all inv,
po_vendors pv,
po_vendor_sites_all ps,
PO_headers_all pha
where inv.vendor_id = pv.vendor_id
and pv.vendor_id = ps.vendor_id
and inv.vendor_site_id = ps.vendor_site_id
and pha.vendor_id = pv.vendor_id
and inv.org_id in (174,169,172)
and ps.inactive_date is null
and pv.END_DATE_ACTIVE is null
GROUP BY
inv.org_id,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
ps.pay_group_lookup_code,
inv.org_id,
CASE WHEN pha.AUTHORIZATION_STATUS IN ( 'APPROVED', 'IN PROCESS') THEN 'ACTIVE'
ELSE 'IN ACTIVE' end
ORDER BY vendor_name DESC
)
WHERE
Max_Invoice_Date < TRUNC(ADD_MONTHS( SYSDATE, -12 ),'MONTH');
-- proposed query
Select
company,
vendor_site_code,
vendor_name,
segment1,
Site_Type,
Max_Invoice_Date,
TEST
From
(
select
inv.org_id company,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
inv.org_id,
CASE WHEN pha_app.vendor_id is not null or pha_proc.vendor_id is not null THEN 'ACTIVE'
ELSE 'IN ACTIVE' end AS TEST,
ps.pay_group_lookup_code AS Site_Type,
MAX (inv.gl_date) AS Max_Invoice_Date,
1 As unit_
from ap_invoices_all inv
inner join po_vendors pv
on inv.vendor_id = pv.vendor_id
inner join po_vendor_sites_all ps
on inv.vendor_site_id = ps.vendor_site_id
and pv.vendor_id = ps.vendor_id
left join po_headers_all pha_app
on pha_app.vendor_id = pv.vendor_id
and pha_app.AUTHORIZATION_STATUS='APPROVED'
left join po_headers_all pha_proc
on pha_proc.vendor_id = pv.vendor_id
and pha_proc.AUTHORIZATION_STATUS='IN PROCESS'
where inv.org_id in (174,169,172)
and ps.inactive_date is null
and pv.END_DATE_ACTIVE is null
and (pha_app.vendor_id is not null and pha_proc.vendor_id is null)
GROUP BY
inv.org_id,
ps.vendor_site_code,
pv.vendor_name,
pv.segment1,
ps.pay_group_lookup_code,
inv.org_id,
CASE WHEN pha_app.vendor_id is not null or pha_proc.vendor_id is not null THEN 'ACTIVE'
ELSE 'IN ACTIVE' end
ORDER BY vendor_name DESC
)
WHERE
Max_Invoice_Date < TRUNC(ADD_MONTHS( SYSDATE, -12 ),'MONTH');
第一个查询返回
COMPANY VENDOR_SITE_CODE VENDOR_NAME SEGMENT1 SITE_TYPE MAX_INVOICE_DATE TEST
172 UMANIS.201 UMANIS SEGM1 EXPENSE 27.04.2015 00:00:00 ACTIVE
172 ROBOZ.301 ROBOZ SEGM1 EXPENSE 11.03.2015 00:00:00 ACTIVE
第二个只返回ROBOZ
COMPANY VENDOR_SITE_CODE VENDOR_NAME SEGMENT1 SITE_TYPE MAX_INVOICE_DATE TEST
172 ROBOZ.301 ROBOZ SEGM1 EXPENSE 11.03.2015 00:00:00 ACTIVE
至于对第二个查询(我提出的解决方案)的逻辑的解释,我现在很累(00:37 AM),我刚刚加入了pha_headers两次,一次是为了#34;批准了&# 34;记录和一次用于&#34; IN PROCESS&#34;记录,所以我可以将它们用作简单的连接,所有记录都在同一记录中。
其他解决方案是可能的,无需访问该表两次(&#34;旋转&#34;具有聚合函数的表和例如CASE)