如何在分组依据中有一些空值和空值
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
部分答案在[这里] (
"检查每个箱码的最大文件日期是否小于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