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

SSRS矩阵无值列消失,使用Cross Join未解决求排查

SSRS矩阵报表保留空值列的SQL修正方案

你的交叉连接问题所在

  1. 逻辑方向错误:你是把已经筛选出有对应维度值的事件记录和维度列表做交叉,这只会让每条已有记录重复对应两个维度,不会生成「事件+缺失维度」的空行,SSRS矩阵自然拿不到空列的数据源。
  2. 语法冗余: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:16