0

我在 oracle 报告生成器中做了一个矩阵报告,就像这样

在此处输入图像描述

这是我正在调用哪个报告的查询

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 报告生成器中做到这一点。

4

1 回答 1

0

至少有两种解决方案。

解决方案 1——在 Oracle Reports 中,创建一个显示零的样板文本对象,并排列该对象,使其显示在矩阵字段的后面。这样,当字段显示时样板文件被隐藏,但在字段不显示时显示。该解决方案在文档中进行了描述。

解决方案 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 

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

于 2013-04-08T15:41:53.693 回答