You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

关键注意点

  1. 日期过滤的位置:一定要把tu.UsageDate = '2018-03-05'放在LEFT JOIN的ON条件里,不能放在WHERE子句!如果放WHERE里,会直接过滤掉没有使用记录的行,就拿不到Items Worked On=0的条目了。
  2. 空值处理:用COALESCE函数把聚合返回的NULL(没有使用记录时)替换为0,这样就能显示Items Worked On=0的情况。
  3. 类的范围:如果有专门的类表(比如tblClass),把AllClasses的数据源换成这个表,能覆盖所有应该统计的类,而不只是已经被使用过的类。

内容的提问来源于stack exchange,提问作者InfOracle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:16:16