Как создать таблицу истории в режиме расчета для каждого дня на основе измерения времени

У меня очень указанная проблема 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;

Моя цель - создать представление, которое показывает значения скидок для каждого возможного дня на основе самого последнего значения. Чтобы присоединить его к более сложным представлениям отчетов о продажах, оно должно быть в форме представления расчетов по сценарию.

Ожидаемый результат - присоединиться к нему в БП и дату документа:

...
'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;
..

person Lukas Idz    schedule 24.06.2019    source источник


Ответы (1)


вы можете попробовать это так:

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), и вы получаете 01.01.2019 для каждого дня до 05.01.2019, который является следующим днем ​​в вашем списке pb_discount.

Поскольку вы не можете группировать по скидке, вы присоединяетесь к этому в качестве последнего шага и должны иметь нужную вам таблицу.

person Niclas Mühl    schedule 07.10.2019