我想解释我的必要性有困难,所以我描述一下场景。
我们想创建一个报表,在这个报表中,这种计算已经完成了,根据这个方案的数值,我们认为第一步应该是返回这样的内容。
ROUND QUANTITY(KG) 1 125 2 125 3 125 4 125 5 125 6 125 7 125 8 125 9 27,5 .
之后,通过简单的操作就可以完成组件的重新计算。
问题是,我们想不出获得所需回报的方法,也想不出实现上述报告的不同方法。
我们能做的就是得到除法的整数部分。
SELECT FLOOR(1027.5/125) AS "TEST" FROM DUMMY
其余
SELECT MOD(1027.5,125) AS "TEST" FROM DUMMY
我们正在使用。
不胜感激
先谢谢你了!
有几种方法可以实现你描述的想要。
一种方法是将需求转化为一个函数,将两个输入参数值,返回生产轮次表。
这个函数可以是这样的。
create or replace function production_rounds(
IN max_production_volume_per_round decimal (10, 2)
, IN production_order_volume decimal (10, 2)
)
returns table (
production_round integer
, production_volume decimal (10, 2))
as
begin
declare rounds_to_produce integer;
declare remainder_production_volume decimal (10, 2);
rounds_to_produce := floor( :production_order_volume / :max_production_volume_per_round);
remainder_production_volume := mod(:production_order_volume, :max_production_volume_per_round);
return
select /* generate rows for all "max" rounds */
s.element_number as production_round
, :max_production_volume_per_round as production_volume
from
series_generate_integer
(1, 1, :rounds_to_produce + 1) s
UNION ALL
select /* generate a row for the final row with the remainder */
:rounds_to_produce + 1 as production_round
, :remainder_production_volume as production_volume
from
dummy
where
:remainder_production_volume > 0.0;
end;
你可以像使用任何表格一样使用这个函数 -- 但要有参数。
select * from production_rounds (125 , 1027.5) ;
PRODUCTION_ROUND PRODUCTION_VOLUME
1 125
2 125
3 125
4 125
5 125
6 125
7 125
8 125
9 27.5
可能需要解释的是 SERIES_GENERATE_INTEGER
. 这是一个HANA特有的内置函数,它从一个 "系列 "中返回若干记录。这里的系列是指在一个最小和最大的限制范围内,并且在两个相邻的时期之间有一定的步长尺寸的序列.更多关于如何工作的信息可以在HANA参考文档中找到,但现在只是说,这是最快的方法来生成一个有X行的结果集。
这个series-generator用于创建所有 "完整 "的生产轮次.对于第二部分的 UNION ALL
然后通过从内置的表格中选择,只创建一行 DUMMY
(DUAL
在Oracle中),它保证只有一条记录.最后,这第二部分需要 "禁用",如果实际上没有剩余,这是由 WHERE
条款。