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%
我有一个固定行的交互式网格,需要在预渲染时计算公式。
所以源查询是:
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%