oracle矩阵报告填充空单元格

时间:2013-04-06 04:32:24

标签: oracle oraclereports

我在oracle报告构建器中制作了一个矩阵报告,如下所示

enter image description here

这是我的查询来自哪个报告

SELECT A.p_date,
       L.sup_name,
       Decode(A.perc_typ, 1, 'Buff',
                          2, 'Cow')     PERC_TYPE,
       A.sup_rate                       RATE,
       Decode(A.perc_typ,
       1, Round(( Nvl(A.fat_perc, 0) * Nvl(A.gross_vol, 0) ) / 6, 5),
       2, Round(
          ( Nvl(A.fat_perc, 0) + (
            ( Nvl(A.fat_perc, 0) * 0.22 ) + (
            Nvl(A.lr_perc, 0) * 0.25 ) + 0.72 ) ) *
          Nvl(A.gross_vol, 0) / 13, 5)) VOL
FROM   mlk_purchase A,
       supplier L
WHERE  A.sup_cod = L.sup_cod
       AND A.p_date <= Trunc(SYSDATE)
       AND a.p_date >= Trunc(SYSDATE) - 7
ORDER  BY 1 

问题是显示空单元格,其中没有数据来自查询。我想显示零个单元格而不是空白区域。有没有办法在oracle报告生成器中执行此操作。

1 个答案:

答案 0 :(得分:0)

至少有两种解决方案。

解决方案1 ​​ - 在Oracle Reports中,创建一个显示零的样板文本对象,并排列此对象,使其显示在矩阵字段后面。这样,样板在显示字段时隐藏,但在未显示字段时显示。此解决方案在documentation

中进行了描述

解决方案2 - 对于没有数据的行和列字段的组合,重写查询以返回零值的行。例如,您可能会找到矩阵行和列字段的所有可能组合(本例中为供应商和日期),外部将数据连接到组合,并使用NVL将空值转换为零。它可能看起来像这样:

SELECT
    L.P_DATE,
    L.SUP_NAME,
    DECODE(A.PERC_TYP, 1, 'Buff', 2, 'Cow') PERC_TYPE,
    A.SUP_RATE RATE,
    NVL
    (
        DECODE
        (
            A.PERC_TYP, 
            1, 
            ROUND
            (
                (NVL(A.FAT_PERC, 0) * NVL(A.GROSS_VOL, 0)) / 6,
                5
            ),
            2,
            ROUND
            (
                (NVL(A.FAT_PERC, 0) + 
                    (
                        (NVL(A.FAT_PERC, 0) * 0.22) + 
                        (NVL(A.LR_PERC, 0) * 0.25) + 0.72)
                    ) * NVL(A.GROSS_VOL, 0) / 13,
                5
            )
        ),
        0
    ) VOL
FROM
    MLK_PURCHASE A,
    (
        SELECT
            L1.SUP_CODE,
            L1.SUP_NAME,
            L2.P_DATE
        FROM
            (
                SELECT DISTINCT 
                    SUPPLIER.SUP_CODE, 
                    SUPPLIER.SUP_NAME 
                FROM 
                    SUPPLIER
            ) L1,
            (
                SELECT DISTINCT
                    MLK_PURCHASE.P_DATE
                FROM
                    MLK_PURCHASE
                WHERE
                    MLK_PURCHASE.P_DATE <= TRUNC(SYSDATE)
                    AND
                    MLK_PURCHASE.P_DATE >= TRUNC(SYSDATE) - 7
            ) L2
    ) L
WHERE 
    A.SUP_COD (+) = L.SUP_COD
    AND
    A.P_DATE (+) = L.P_DATE
ORDER BY
    1 

将查询重写为相同效果的更有效(且更简单)的方法可能是使用MLK_PURCHASESUPPLIER之间的partitioned outer join分区SUP_CODE,但我不知道您的Oracle Reports版本在多大程度上支持这种语法。