SSRS矩阵无值列消失,使用Cross Join未解决求排查
SSRS矩阵报表保留空值列的SQL修正方案
你的交叉连接问题所在
- 逻辑方向错误:你是把已经筛选出有对应维度值的事件记录和维度列表做交叉,这只会让每条已有记录重复对应两个维度,不会生成「事件+缺失维度」的空行,SSRS矩阵自然拿不到空列的数据源。
- 语法冗余:
IN ('Rcv Temp Min', ('Rcv Temp Max'))里多了一层括号,虽然Oracle兼容,但建议修正避免歧义。
正确的SQL写法
核心思路:先获取所有符合时间条件的主事件记录,再和需要显示的维度(温度项)做交叉连接,最后左连接到明细数据表,确保所有维度组合都被保留,哪怕没有对应值。
-- 定义要显示的固定维度列表 WITH dim_temp AS ( SELECT 'Rcv Temp Min' AS c251_desc FROM DUAL UNION ALL SELECT 'Rcv Temp Max' AS c251_desc FROM DUAL ), -- 获取符合时间条件的所有主事件 main_events AS ( SELECT C250_INT_EVENTNR, C250_KEYCODE, c250_desc, c250_mod_user, c250_mod_date FROM user.t250 WHERE c250_mod_date >= :date ) -- 交叉连接生成所有可能的事件+维度组合,左连接补明细数据 SELECT me.C250_INT_EVENTNR, me.C250_KEYCODE, me.c250_desc, me.c250_mod_user, me.c250_mod_date, dt.c251_desc, b.c251_valuenew, b.c251_valueold, b.C251_SUPPLIER FROM main_events me CROSS JOIN dim_temp dt LEFT JOIN wawiadm.t251 b ON b.C251_INT_EVENTNR = me.C250_INT_EVENTNR AND b.c251_desc = dt.c251_desc ORDER BY me.c250_mod_date DESC;
补充说明
- 用
WITH子句拆分逻辑,更清晰易维护; - 直接用
DUAL生成固定维度列表,比从t251查询更可靠(避免t251中某维度暂时无数据导致维度丢失); - 维度匹配条件
b.c251_desc = dt.c251_desc必须写在ON子句中,若写在WHERE里会退化为内连接,丢失空值行。
内容的提问来源于stack exchange,提问作者Aidas Dem
相关产品推荐
相关产品推荐

