SSRS Report Builder条形图实现零计数日期列显示(包裹到货预测场景)
全量日期列展示实现方案
问题根因
当前数据集仅从实际存在的运单记录中提取分类,当某日期分类下没有匹配运单时,对应分组会被直接过滤,数据集内不存在该分类的实体行,图表会自动跳过无对应数据的类别列。
方案1:SQL层补全固定日期基准(推荐优先使用)
核心逻辑是先构造一套固定的7天分类基准虚拟表,和实际运单数据做左连接,保证不管有没有匹配运单,7个日期分类都会以实体行的形式存在于数据集中,无运单的分类计数自动为0。
可直接替换为如下调整后的查询:
WITH DeliveryDayBaseline AS ( -- 固定构造全量7天分类基准,同时附带排序值保证列序正确 SELECT 'Today' AS DeliveryDay, 0 AS SortOrder UNION ALL SELECT 'Tomorrow', 1 UNION ALL SELECT '+2 Days', 2 UNION ALL SELECT '+3 Days', 3 UNION ALL SELECT '+4 Days', 4 UNION ALL SELECT '+5 Days', 5 UNION ALL SELECT '+6 Days', 6 ), ActualPackageRecords AS ( SELECT TrackingNumber, CASE WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=0 THEN 'Today' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=1 THEN 'Tomorrow' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=2 THEN '+2 Days' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=3 THEN '+3 Days' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=4 THEN '+4 Days' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=5 THEN '+5 Days' WHEN DATEDIFF(DAY,GETDATE(),ScheduledDelivery)=6 THEN '+6 Days' ELSE NULL END AS DeliveryDay FROM 你的实际运单表名 -- 替换为你环境内的实际包裹表名 ) SELECT b.DeliveryDay, b.SortOrder, COUNT(a.TrackingNumber) AS PackageCount FROM DeliveryDayBaseline b LEFT JOIN ActualPackageRecords a ON b.DeliveryDay = a.DeliveryDay GROUP BY b.DeliveryDay, b.SortOrder ORDER BY b.SortOrder
注意:原查询的分类值开头存在多余空格(如
' Today'),已在调整后的语句中统一去除,避免后续匹配出现值不一致的问题。
方案2:Report Builder 轴配置兜底(适合无法修改SQL的场景)
如果没有权限调整底层数据集查询,可直接在图表配置中手动指定固定分类规则,绕过数据集的缺行问题:
- 打开图表的水平轴属性面板
- 在轴选项的类别配置中,手动录入全量分类值列表:
Today, Tomorrow, +2 Days, +3 Days, +4 Days, +5 Days, +6 Days - 开启“显示无数据的类别”开关,将无数据类别的计数显示值设为0
- 用之前SQL中附带的
SortOrder字段作为横轴排序依据,避免文本排序导致的列序错乱
内容的提问来源于stack exchange,提问作者Kayleigh Deacon
相关产品推荐
相关产品推荐

