使用HAVING子句过滤空值行:分组存在非空值时忽略IDNum空值
按日期分组的聚合报表解决方案
咱们先把需求掰扯清楚:要按CreateDate做分组统计,核心规则是——只要某一天存在至少一个非空的IDNum,就把当天所有IDNum为空的记录全排除;只有当某天所有记录的IDNum都是空的时候,才保留那些空值记录。
实现思路
我用窗口函数来给每个日期打个"标记",先统计每个日期下非空IDNum的总数:
- 如果这个总数大于0,说明当天有有效ID,只留
IDNum IS NOT NULL的记录 - 如果总数等于0,说明当天全是空ID,就保留所有记录
基础筛选SQL代码
WITH DateIdStatus AS ( SELECT PersonName, IDNum, CreateDate, -- 统计当前日期下非空IDNum的数量 COUNT(IDNum) OVER (PARTITION BY CreateDate) AS NonNullIdCount FROM YourTableName -- 记得替换成你的实际表名 ) SELECT CreateDate, PersonName, IDNum FROM DateIdStatus WHERE -- 两种合法情况:要么当天有有效ID且当前记录ID非空;要么当天全是空ID,全部保留 (NonNullIdCount > 0 AND IDNum IS NOT NULL) OR NonNullIdCount = 0;
进阶聚合报表(如果需要统计汇总数据)
要是你需要进一步统计每天的人数、有效ID数这类聚合值,可以在上面的基础上再加一层分组:
WITH DateIdStatus AS ( SELECT PersonName, IDNum, CreateDate, COUNT(IDNum) OVER (PARTITION BY CreateDate) AS NonNullIdCount FROM YourTableName ), FilteredData AS ( SELECT CreateDate, PersonName, IDNum FROM DateIdStatus WHERE (NonNullIdCount > 0 AND IDNum IS NOT NULL) OR NonNullIdCount = 0 ) SELECT CreateDate, COUNT(DISTINCT PersonName) AS 当日唯一人数, COUNT(IDNum) AS 当日有效ID数量 FROM FilteredData GROUP BY CreateDate ORDER BY CreateDate;
内容的提问来源于stack exchange,提问作者user3657661
相关产品推荐
相关产品推荐

