如何在SQL查询中包含Items Worked On为0的行以生成报表?
实现包含Items Worked On=0的查询方案
我来帮你搞定这个报表需求!要把那些**没有被DD部门用户使用的ClassName条目(即Items Worked On=0)也包含到结果里,核心思路是用左连接(LEFT JOIN)**保留所有目标类名,再通过聚合函数把空统计值替换为0。下面分步骤给你具体方案:
先明确表结构(按需调整)
先假设你的两张表关键字段是这样的(如果实际字段名不同,对应替换即可):
tblUser:UserID(用户唯一标识)、Department(部门字段)tblTableUsage:UserID(关联用户)、ClassName(类/表名)、UsageDate(使用日期)、UsageCount(单次使用的条目数;如果每条记录代表1次使用,后续用COUNT替代SUM就行)
方案1:展示每个类+每个DD用户的使用情况(含0)
如果需要报表里同时体现:
- 所有存在的ClassName(哪怕DD部门没人用)
- 每个DD用户对该类的使用次数(没使用的用户对应0)
可以用这个SQL:
-- 先筛选出DD部门的所有用户 WITH DDUsers AS ( SELECT UserID FROM tblUser WHERE Department = 'DD' ), -- 获取所有需要统计的唯一ClassName(如果有专门的类表,换成该表更准确) AllClasses AS ( SELECT DISTINCT ClassName FROM tblTableUsage ) SELECT ac.ClassName, du.UserID, -- 没有使用记录时,把NULL转为0 COALESCE(SUM(tu.UsageCount), 0) AS UsageCount, COALESCE(SUM(tu.UsageCount), 0) AS "Items Worked On" FROM AllClasses ac -- 交叉连接生成「所有类 + 所有DD用户」的组合,确保每个组合都有行 CROSS JOIN DDUsers du -- 左连接使用记录,匹配类、用户、日期 LEFT JOIN tblTableUsage tu ON ac.ClassName = tu.ClassName AND du.UserID = tu.UserID AND tu.UsageDate = '2018-03-05' GROUP BY ac.ClassName, du.UserID ORDER BY ac.ClassName, du.UserID;
方案2:展示每个类的总使用次数(含0)+ 用户使用明细
如果报表更关注每个类的总使用情况,同时列出使用过的用户(没用户使用的类标记为"No User"),可以用这个:
WITH AllClasses AS ( SELECT DISTINCT ClassName FROM tblTableUsage ), -- 先统计DD部门用户在指定日期的使用记录 DDUsageSummary AS ( SELECT ClassName, UserID, SUM(UsageCount) AS UsageCount FROM tblTableUsage tu JOIN tblUser u ON tu.UserID = u.UserID WHERE u.Department = 'DD' AND tu.UsageDate = '2018-03-05' GROUP BY ClassName, UserID ) SELECT ac.ClassName, COALESCE(su.UserID, 'No User') AS UserID, COALESCE(su.UsageCount, 0) AS UsageCount, COALESCE(su.UsageCount, 0) AS "Items Worked On" FROM AllClasses ac -- 左连接统计结果,保留所有类 LEFT JOIN DDUsageSummary su ON ac.ClassName = su.ClassName ORDER BY ac.ClassName;
关键注意点
- 日期过滤的位置:一定要把
tu.UsageDate = '2018-03-05'放在LEFT JOIN的ON条件里,不能放在WHERE子句!如果放WHERE里,会直接过滤掉没有使用记录的行,就拿不到Items Worked On=0的条目了。 - 空值处理:用
COALESCE函数把聚合返回的NULL(没有使用记录时)替换为0,这样就能显示Items Worked On=0的情况。 - 类的范围:如果有专门的类表(比如
tblClass),把AllClasses的数据源换成这个表,能覆盖所有应该统计的类,而不只是已经被使用过的类。
内容的提问来源于stack exchange,提问作者InfOracle
相关产品推荐
相关产品推荐

