在hana/crystalreports中使用参数计算的查询

2q5ifsrm  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(375)

我很难解释我的必要性,所以我来描述一下情况。

场景:

产品a一次最大产量为125公斤。
操作员收到1027.5kg产品a的生产订单。
操作员必须计算他将要制造多少轮,并调整每轮的部件数量。
我们希望创建一个报告,其中这些计算已经完成,我们认为第一步是根据此场景的值返回如下内容:
轮数(kg)
1             125
2             125
三             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

我们正在使用:
sap hana sql
水晶报告
树液b1
任何帮助都将不胜感激
提前谢谢!

pobjuy32

pobjuy321#

有几种方法可以实现您所描述的目标。
一种方法是将需求转换为一个函数,该函数接受两个输入参数值并返回生产轮次表。
它可以如下所示:

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行的结果集的最快方法。
此序列生成器用于创建所有“完整”生产循环。第二部分 UNION ALL 然后,通过从内置表中选择只创建一行 DUMMY ( DUAL 在甲骨文中)保证只有一条记录。最后,如果实际上没有余数,则需要“禁用”第二部分,这是由 WHERE 条款。

相关问题