【问题标题】:Is there a SQL query/function that returns a grouping of rows when only one row meets requirements of the WHERE clause?当只有一行满足 WHERE 子句的要求时,是否有返回一组行的 SQL 查询/函数?
【发布时间】:2020-06-15 21:45:10
【问题描述】:

我有一个记录发票审批的数据库表 (INVOICES):

    ORDER | INVOICE_NBR | APPROVAL_LEVEL | APPROVAL_DATE | APPROVER  
    123   |001          |1               |02-FEB-20      |John Smith
    123   |001          |2               |17-FEB-20      |Jane Smith
    123   |001          |3               |25-FEB-20      |Matt Jones
    123   |002          |1               |10-MAR-20      |John Smith
    123   |002          |2               |21-MAR-20      |Jane Smith
    123   |002          |3               |02-APR-20      |Matt Jones

如果在某个日期之后对发票进行了任何批准,我想检索该发票的所有批准。我试图对每张发票进行分组,然后使用 HAVING 子句...

Select ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
From INVOICES
Group By ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
Having APPROVAL_DATE >= '01-APR-20'

...但我仍然只返回上表的最后一行。如何根据 01-APR-20 之后的任何批准日期返回发票 002 的所有批准级别?

【问题讨论】:

    标签: sql oracle-sqldeveloper


    【解决方案1】:

    使用exists:

    select i.*
    from invoices i
    where exists (select 1
                  from invoices i2
                  where i2.invoice_nbr = i.invoice_nbr and
                        i2.approval_date >= date '2020-04-01'
                 );
    

    你也可以使用窗口函数:

    select i.*
    from (select i.*,
                 max(approval_date) over (partition by invoice_nbr) as max_approval_date
          from invoices i
         ) i
    where max_approval_date >= date '2020-04-01';
    

    【讨论】:

      【解决方案2】:

      您可以在一个查询中同时包含 WHERE 和 HAVING 子句。 WHERE 在分组之前过滤数据,之后是 HAVING。试试这样的...

      Select ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
      From INVOICES
      WHERE APPROVAL_DATE >= '01-APR-20'
      

      在你的情况下,我认为你甚至不需要对你的数据进行分组。

      【讨论】:

        【解决方案3】:

        使用self-join

        select i.*
        from invoices i
        inner join (select distinct invoice_nbr 
                    from invoices
                    where approval_date >= date '2020-04-01') i2 on i2.invoice_nbr = i.invoice_nbr
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 1970-01-01
          • 2014-10-21
          相关资源
          最近更新 更多