检查 user_id 的所有值是否为 NOT NULL

Checking if all values for user_id IS NOT NULL

我有这样的数据集:

UserID  AccountID   CloseDate
1        1000       14/3/2022
1        2000       16/3/2022
2        1000       NULL
2        2000       4/3/2022
2        3000       NULL

而且我想检查一个 user_id 内是否所有的结束日期都不为空。换句话说,如果 user_id 内的所有帐户都已关闭。我正在尝试使用 MAX 或 MIN,但它没有像我预期的那样工作,因为它只是在避免 NULL 值。还有其他功能可以检查吗?假设我的输出将是另一列,当所有 CloseDates 都不为空时,它将分配 1,否则为 0。

示例输出:

UserID  AccountID   CloseDate   Check
1        1000       14/3/2022   1
1        2000       16/3/2022   1
2        1000       NULL        0
2        2000       4/3/2022    0
2        3000       NULL        0

使用条件聚合显式 COUNT 列具有值 NULL:

的行
SELECT GroupedColumn,
       COUNT(CASE WHEN NullableColumn IS NULL THEN 1 END) AS NullCount
FROM dbo.YourTable
GROUP BY GroupedColumn;

如果您只想使用 10,只需将计数包装在 CASE 表达式中即可:

CASE COUNT(CASE WHEN NullableColumn IS NULL THEN 1 END) WHEN 0 THEN 1 ELSE 0 END
with dataset as (select 1 as UserId, 1000 as AccountID, '14/3/2022' as CloseDate 
                 union all select 1, 2000, '16/3/2022' 
                 union all select 2, 1000, NULL 
                 union all select 2, 2000, '4/3/2022' 
                 union all select 2, 3000, NULL)


select userid from dataset 
group by userid 
having sum(case when closedate is null then 1 else 0 end) = 0;

你可以尝试使用FIRST_VALUE条件window函数

SELECT *,
       FIRST_VALUE(IIF(CloseDate IS NULL,0,1)) OVER(PARTITION BY UserID ORDER BY CloseDate )
FROM T 

sqlfiddle

select d.*, iif(chk>0, 0, 1) chk
from d
outer apply (
    select UserId, COUNT(*) CHK
    from d dd
    WHERE d.UserId = dd.UserId
    and dd.CloseDate IS NULL
    group by UserId
) C

您也可以使用“存在”。例如:

select y.UserID, y.AccountID, y.CloseDate, 

-- [Check]: returns 0 if there is a row in the table for the 
-- UserID where CloseDate is null, else 1  
(case when exists(select * from YourTable y2 where y2.UserID = y.UserID
AND y2.CloseDate is null) then 0 else 1 end) as [Check] 

from YourTable y