Sql 如果返回两个值,如何排除供应商
我需要创建一个子句来限制返回的数据Sql 如果返回两个值,如何排除供应商,sql,oracle,Sql,Oracle,我需要创建一个子句来限制返回的数据 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
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');
如果采购订单标题中的授权状态返回所有状态“已批准”和“正在处理”,则不返回供应商。但是,如果它自己返回“批准”,我需要返回供应商
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');
这样做的目的是退回没有未完成采购订单的供应商
有没有办法做到这一点
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')
如果结果如上所示,我想排除供应商 好的,我们开始吧
但首先是一个必要的指向
你可以在这个答案中找到这样一个例子,并希望在你的问题中加入这样一个例子。这个例子可以被广泛地简化,因为许多字段实际上和您的核心问题并没有关系。当条件是另一个表中存在两个相关记录时,我如何过滤记录?但取决于您的具体业务需求
我决定不简化任何事情,因为我希望能够准确地测试您在问题中提出的查询
我试图根据您所说的,从查询和样本输出中重新创建样本数据
我已经创建了两个供应商:UMANIS,其标题状态包含APPROVED和IN-PROCESS,因此应将其过滤掉;ROBOZ,其标题状态仅包含APPROVED,因此应将其返回
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');
第二个只返回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,我刚刚加入了pha_头两次,一次用于已批准的记录,一次用于正在处理的记录,因此我可以将它们用作简单的连接,都在同一条记录上
也可以使用其他解决方案,无需访问表两次。例如,使用聚合函数和案例旋转表。请提供示例数据和所需结果。为什么简单的where子句不起作用?不在“已批准”、“正在处理”中?嗨@GordonLinoff。该查询用于显示没有未完成采购订单的供应商。如果供应商有“正在处理”且“已批准”的采购订单,则该供应商需要被排除在外,因为报告的主要重点是停用没有针对他们的未完成采购订单的非交易供应商,我很想回答是,有:-我可以说您可以使用SELECT*FROM SUPPLIERS,其中供应商ID不在SELECT SUPPLIER\u ID中,订单状态为“已批准”、“正在处理”。。。但是你最好编辑这个问题,放上一些表名、结构和可能的数据,让你能够比较愿意帮助你的不同人的答案。Hi@Insac,我希望上面的内容有意义。欢迎你。那么,你是要接受这个答案,还是有些东西仍然不适合你?是的,我已经接受了这个答案。我建议花点时间来解决这个问题,因为我在这个世界上还是个初学者。