Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果返回两个值,如何排除供应商_Sql_Oracle - Fatal编程技术网

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,我希望上面的内容有意义。欢迎你。那么,你是要接受这个答案,还是有些东西仍然不适合你?是的,我已经接受了这个答案。我建议花点时间来解决这个问题,因为我在这个世界上还是个初学者。