我在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报告生成器中执行此操作。
答案 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_PURCHASE
和SUPPLIER
之间的partitioned outer join分区SUP_CODE
,但我不知道您的Oracle Reports版本在多大程度上支持这种语法。