0

我有非常 HANA/SQLScript 指定的问题。我需要根据带有日期间隔的表以脚本计算视图的形式为每一天创建一个历史视图吗?

我尝试使用“_SYS_BI”。“M_TIME_DIMENSION”进行每个交叉连接,并且只使用函数。

根据我的经验,交叉连接是累积和的理想选择,但不适用于显示单个值。

HANA 不允许使用列作为表函数的输入参数。

标量函数也不能在计算视图中使用。我可以激活该视图,但无法从中读取数据。即使功能独立工作正常:

业务伙伴折扣表:

 CREATE COLUMN TABLE "BP_DISCOUNT" ("BP_CODE" VARCHAR(50) NOT NULL ,
         "DATE" DATE L ,
         "DISCOUNT" DECIMAL(21,6);


insert into "BP_DISCOUNT" values('abc','20190101','0');
insert into "BP_DISCOUNT" values('abc','20190105','5');
insert into "BP_DISCOUNT" values('abc','20190110','10');

我想用来代替的功能:

CREATE FUNCTION bp_discountF (BP_Code varchar(50), Date_D date)
 RETURNS discount decimal(21,6)
 LANGUAGE SQLSCRIPT 
 SQL SECURITY INVOKER 
 AS
 BEGIN

 select  "DISCOUNT" into DISCOUNT
from "BP_DISCOUNT" d
where 
:BP_CODE = d."BP_CODE" and d."DATE"<= :DATE_D order by d."DATE" desc limit 1;
 END;

我的目标是创建一个视图,根据最近的值显示每天的折扣值。它必须以脚本计算视图的形式加入到更复杂的销售报告视图中。

预期结果是在 BP 和文件日期加入它:

...
'abc', '20190101', 0;
'abc', '20190102', 0;
'abc', '20190103', 0;
'abc', '20190104', 0;
'abc', '20190105', 5;
'abc', '20190106', 5;
'abc', '20190107', 5;
'abc', '20190108', 5;
'abc', '20190109', 5;
'abc', '20190110', 10;
'abc', '20190111', 10;
..
4

1 回答 1

0

你可以这样尝试:

DO BEGIN

times=
select DATE_SAP from M_TIME_DIMENSION
where DATE_SAP between '20190101' and '20190110';

dates=
select * from :times
left join bp_discount
on DATE <= DATE_SAP
order by DATE_SAP;

listdates=
select DATE_SAP, BP_CODE, max(DATE) as DATE
from :dates
group by DATE_SAP, BP_CODE
order by DATE_SAP;

select ld.DATE, ld.DATE_SAP, ld.BP_CODE, bpd.DISCOUNT from :listdates as ld
inner join bp_discount as bpd
on ld.BP_CODE = bpd.BP_CODE and ld.DATE = bpd.DATE
order by DATE_SAP;

END;

时间只是您需要的日期,为了更容易,我只是选择了需要的日期..

在日期中,您会从折扣表中获得每个日期的表格,并从时间维度表中获得大于该日期的每个日期。

现在你想要每次最大日期,因为当然,06.01.2019 也大于 01.01.2019,但是你想要在这个日期引用 05.01.2019。因此,您选择 Max(DATE),您会在 05.01.2019 之前的每一天获得 01.01.2019,这是您 pb_discount 列表中的第二天。

由于您不能按折扣分组,因此您将其作为最后一步加入,并且应该拥有您需要的表格。

于 2019-10-07T13:41:11.887 回答