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

Report Builder 3.0日期间隙查询及报表数据缺失技术问询

解决Report Builder 3.0中日期间隙缺失及就诊人次统计问题

我来帮你搞定这个问题!核心症结是你的查询没有基于连续的日期序列——当某天没有警察护送的就诊记录时,这条日期直接从结果集里消失了,导致图表跳空。咱们通过「生成连续日期维度 + 左连接业务数据」的方式彻底解决:

第一步:生成过去30天的连续日期序列

先通过CTE生成过去30天的所有日期,不管当天有没有就诊记录。这一步是补全日期间隙的关键:

WITH DateRange AS (
    -- 生成从今天往前推30天的连续日期
    SELECT DATEADD(DAY, -n, CAST(GETDATE() AS DATE)) AS ReportDate
    FROM (
        -- 生成0-29的数字序列,对应过去30天
        SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS n
        FROM sys.all_columns -- 用系统表生成数字,也可以用数字表/自定义函数
    ) AS NumberSeries
)

第二步:关联就诊数据,统计去重人次

把上面的连续日期序列和你的就诊表做左连接,这样所有日期都会被保留,没有数据的日期会返回0(而非缺失)。同时一次性统计总就诊人次和警察护送人次:

WITH DateRange AS (
    SELECT DATEADD(DAY, -n, CAST(GETDATE() AS DATE)) AS ReportDate
    FROM (
        SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS n
        FROM sys.all_columns
    ) AS NumberSeries
)
SELECT
    dr.ReportDate,
    -- 统计每日总就诊去重人次
    COUNT(DISTINCT vt.VisitID) AS TotalUniqueVisits,
    -- 统计每日警察护送的去重人次(没有则返回0)
    COUNT(DISTINCT CASE WHEN vt.HasPoliceEscort = 1 THEN vt.VisitID END) AS PoliceEscortUniqueVisits
FROM DateRange dr
-- 左连接确保所有日期都保留
LEFT JOIN YourVisitTable vt ON CAST(vt.VisitDateTime AS DATE) = dr.ReportDate
GROUP BY dr.ReportDate
ORDER BY dr.ReportDate

注意事项:

  • 替换YourVisitTable为你实际的就诊表名
  • 替换VisitID(就诊唯一标识)、VisitDateTime(就诊时间)、HasPoliceEscort(是否有警察护送的标记字段,比如bit类型的1/0)为你表中的实际字段
  • 如果你的数据库有现成的日期维度表(数据仓库常用),可以直接用它代替CTE生成的DateRange,性能更优

第三步:Report Builder报表配置

把这个查询作为数据集导入后,配置图表时注意:

  • 类别轴选择ReportDate,并设置轴类型为「日期/时间」,确保SSRS按时间顺序渲染
  • 如果需要月度统计,只需把ReportDate替换为DATEFROMPARTS(YEAR(dr.ReportDate), MONTH(dr.ReportDate), 1)作为月度起始日期,然后GROUP BY这个字段即可
  • 图表数值轴会自动显示0值,不会再出现日期缺失的情况

这样处理后,那些没有警察护送就诊的日期会在图表中显示为0,完美解决间隙问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:18:39