是否有SQL query/function returns 一组行,当只有一行满足WHERE子句的要求?
Is there a SQL query/function that returns a grouping of rows when only one row meets requirements of the WHERE clause?
我有一个数据库 table (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'
...但我仍然只 return 上面 table 的最后一行。我如何根据发票 002 的任何批准日期在 01-APR-20 之后 return 所有批准级别?
使用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'
);
您还可以使用 window 函数:
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';
您可以在一个查询中同时包含 WHERE 和 HAVING 子句。 WHERE 在分组之前过滤数据,然后 HAVING 过滤数据。尝试这样的事情...
Select ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
From INVOICES
WHERE APPROVAL_DATE >= '01-APR-20'
对于您的情况,我认为您甚至不需要对数据进行分组。
使用 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
我有一个数据库 table (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'
...但我仍然只 return 上面 table 的最后一行。我如何根据发票 002 的任何批准日期在 01-APR-20 之后 return 所有批准级别?
使用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'
);
您还可以使用 window 函数:
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';
您可以在一个查询中同时包含 WHERE 和 HAVING 子句。 WHERE 在分组之前过滤数据,然后 HAVING 过滤数据。尝试这样的事情...
Select ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
From INVOICES
WHERE APPROVAL_DATE >= '01-APR-20'
对于您的情况,我认为您甚至不需要对数据进行分组。
使用 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