Oracle APex 计算渲染利润

Oracle APex calculate profit on rendering

我有一个固定行的交互式网格,需要在预渲染时计算公​​式。

所以源查询是:

select kpi,monthly,yearly from kpi where project_id = :P1_PROJECT_ID;

我需要修改它,以便在渲染时计算 kpi='Gross' 的行。

它在网格中看起来像:

预期结果:(毛=Profit/Loss)

我正在尝试编写 sql 查询,但它不起作用。 尽管数据 returns 为空。 我在这里做错了什么?

 select kpi,
case when KPI='Gross'
then to_char(case when KPI='Profit' then to_number(replace(nvl(monthly,0),',','')) end /
case when KPI='Loss' then to_number(replace(nvl(monthly,0),',','')) end ,'999,999,999,999') 
else to_char( monthly,'999,999,999,999') end as monthly,
case when KPI='Gross'
then to_char(case when KPI='Profit' then to_number(replace(nvl(yearly,0),',','')) end /
case when KPI='Loss' then to_number(replace(nvl(yearly,0),',','')) end ,'999,999,999,999')  
else to_char( yearly,'999,999,999,999') end as yearly,
from kpi where project_id = :P1_PROJECT_ID;

To_char 用于以逗号分隔显示值。 因此,当 KPI=Gross 时,它将 kpi=profit 的列除以 kpi=Loss 并显示结果。

KPI=Gros 行中的结果也应该有 % 连接。

顶点 20.2

如何实现?

你很接近,但你需要使用 window 功能。如果不使用 window 函数,查询将不会查看 case 语句中的其他行来计算 GROSS 列。

下面的查询是如何使用 window 函数正确计算 GROSS。我添加了 ROUND 以将总金额四舍五入为整数,但如果您想要小数点,可以将其删除。

WITH
    kpi (pk,
         kpi,
         monthly,
         yearly,
         project_id)
    AS
        (SELECT 1, 'Revenue', 60000, 2000000, 1 FROM DUAL
         UNION ALL
         SELECT 2, 'Profit', 20, 30, 1 FROM DUAL
         UNION ALL
         SELECT 3, 'Loss', 10, 50, 1 FROM DUAL
         UNION ALL
         SELECT 4, 'Gross', NULL, NULL, 1 FROM DUAL)
SELECT k.kpi,
       CASE k.kpi
           WHEN 'Gross'
           THEN
                  ROUND (
                        SUM (CASE k.kpi WHEN 'Profit' THEN k.monthly ELSE 0 END)
                            OVER (PARTITION BY project_id)
                      / SUM (CASE k.kpi WHEN 'Loss' THEN k.monthly ELSE 0 END)
                            OVER (PARTITION BY project_id))
               || '%'
           ELSE
               TO_CHAR (k.monthly)
       END    AS monthly,
       CASE k.kpi
           WHEN 'Gross'
           THEN
                  ROUND (
                        SUM (CASE k.kpi WHEN 'Profit' THEN k.yearly ELSE 0 END)
                            OVER (PARTITION BY project_id)
                      / SUM (CASE k.kpi WHEN 'Loss' THEN k.yearly ELSE 0 END)
                            OVER (PARTITION BY project_id))
               || '%'
           ELSE
               TO_CHAR (k.yearly)
       END    AS yearly
  FROM kpi k
 WHERE project_id = 1;
       KPI    MONTHLY     YEARLY
__________ __________ __________
Revenue    60000      2000000
Profit     20         30
Loss       10         50
Gross      2%         1%