如果供应商返回两个值,如何排除供应商

时间:2016-10-18 14:33:31

标签: sql oracle

我需要创建一个子句来限制返回的数据。

如果来自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

如果结果如上所述,我想排除供应商。

1 个答案:

答案 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)