SSRS报表无t6对应测试数据时如何保留全量行并置空字段
问题根因
你写的LEFT OUTER JOIN未生效的核心原因是:所有针对tests关联表(t1~t6)的var_id过滤条件被写在了WHERE子句中。
当左连接未匹配到对应测试记录时,关联表的所有字段值都会返回NULL,此时WHERE里的t6.var_id = 3657这类判断对NULL值不成立,数据库会直接过滤掉这部分行,最终效果和内连接完全一致,自然会丢失没有t6记录的行。
另外原查询把时间范围条件绑定在t1.result_on上,如果出现t1记录缺失的场景也会丢行,时间条件应该绑定主表events的时间字段。
修正方法
- 将每个tests表对应的var_id匹配条件,从WHERE子句移动到对应表的
LEFT JOIN ... ON关联条件中,避免左连接生成的NULL行被WHERE条件过滤。如果确认t1、t3是报表必须匹配的过滤项(不存在这两个测试记录的事件不需要展示),可以将t1、t3的连接改为INNER JOIN,其余t2、t4、t5如果也是必存在测试项同理,仅保留t6为左连接即可,查询效率会更高。 - 将时间范围过滤条件从t1.result_on字段调整为主表e的timestamp字段,避免因关联表记录缺失导致符合要求的事件行被过滤。
- SQL逻辑修正后,不存在t6测试记录的行会自动返回NULL值,不需要在SSRS报表层额外写IsNothing判断,直接绑定字段展示即可自动留空,已存在的t6值也会和其他字段正确对齐。
修正后SQL语句
SELECT e.event_num, event_status, e.event_ID, t1.result as Quality_issue, t2.result as Reason, t3.result as Storage, t4.result as Grade, t5.result as Roll_Bulk, t6.result as Reason_Note, prodstatus_desc_local as P FROM events e LEFT OUTER JOIN tests t1 ON e.timestamp = t1.result_on AND t1.var_id = 24777 LEFT OUTER JOIN tests t2 ON e.timestamp = t2.result_on AND t2.var_id = 16 LEFT OUTER JOIN tests t3 ON e.timestamp = t3.result_on AND t3.var_id = 312 LEFT OUTER JOIN tests t4 ON e.timestamp = t4.result_on AND t4.var_id = 1249 LEFT OUTER JOIN tests t5 ON e.timestamp = t5.result_on AND t5.var_id = 1130 LEFT OUTER JOIN tests t6 ON e.timestamp = t6.result_on AND t6.var_id = 3657 LEFT OUTER JOIN Production_status P ON e.Event_Status = P.ProdStatus_Id WHERE e.pu_id = 2 AND e.timestamp >= @StartTime AND e.timestamp < @EndTime
注意:如果后续还有其他可选关联的测试字段,都要把对应var_id的过滤条件写在JOIN的ON子句里,不能写在WHERE层,否则会再次出现丢行问题。
内容的提问来源于stack exchange,提问作者Seth Seefeldt
相关产品推荐
相关产品推荐

