如何在分组依据中有一些空值和空值

How to have some null and empty values in a Group By

部分答案在[这里] () 并且有效:

"检查每个箱码的最大文件日期是否小于2022-01-01,可以使用:

SELECT b.code,
   MAX(b.EXPIRATION_DATE) AS expiration_date
FROM   box b
   join COMPONENT_A cpp on cpp.b_Id=b.Id
   join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
   join "FILE" f on f.Z_Id =cpt.Id
WHERE  b.EXPIRATION_DATE < DATE '2022-01-01'
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01';

但它也需要文件(或多个框)没有日期的框。如何避免一个文件没有日期或框本身的所有框? 我尝试添加一个假的外部日期:

HAVING MAX(f.EXPIRATION_DATE) < '01/01/2022';
AND NVL(min(f.EXPIRATION_DATE), to_date('01/01/1011','DD/MM/YY'))<>TO_DATE('01/01/1011','DD/MM/YY')

但是

min(f.EXPIRATION_DATE) 

不起作用,因为“min”取出了 null/empty,它不会将 null/empty 视为“min”。我在群里,我必须使用聚合表达式。

您可以 COUNT 具有 NULL 过期日期的文件数量,并确保有零,并且假设每组有一个盒子并且盒子的过期日期对于所有行然后你可以使用:

SELECT b.code,
   MAX(b.EXPIRATION_DATE) AS expiration_date
FROM   box b
   join COMPONENT_A cpp on cpp.b_Id=b.Id
   join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
   join "FILE" f on f.Z_Id =cpt.Id
WHERE  b.EXPIRATION_DATE < DATE '2022-01-01'
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01'
AND    COUNT(CASE WHEN f.EXPIRATION_DATE IS NULL THEN 1 END) = 0;

如果一个组中可以有多个具有不同到期日期的框行,那么您可以使用:

SELECT b.code,
   MAX(b.EXPIRATION_DATE) AS expiration_date
FROM   box b
   join COMPONENT_A cpp on cpp.b_Id=b.Id
   join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
   join "FILE" f on f.Z_Id =cpt.Id
WHERE  b.EXPIRATION_DATE < DATE '2022-01-01'
OR     b.expiration_date IS NULL
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01'
AND    COUNT(CASE WHEN b.EXPIRATION_DATE IS NULL THEN 1 END) = 0
AND    COUNT(CASE WHEN f.EXPIRATION_DATE IS NULL THEN 1 END) = 0;

db<>fiddle here