пример использования языка rlang без библиотек на примере ABC анализа. сначала создаем таблицу
Code:
CREATE COLUMN TABLE "R"."PRICE" ("CODE" NVARCHAR(20),
"ART" NVARCHAR(20),
"COLOR" NVARCHAR(20),
"SIZE" NVARCHAR(20),
"JAN" INTEGER CS_INT,
"FAB" INTEGER CS_INT,
"MAR" INTEGER CS_INT,
"APR" INTEGER CS_INT,
"MAY" INTEGER CS_INT,
"JUN" INTEGER CS_INT,
"JUL" INTEGER CS_INT,
"AUG" INTEGER CS_INT,
"SEN" INTEGER CS_INT,
"OCT" INTEGER CS_INT,
"NOV" INTEGER CS_INT,
"DEC" INTEGER CS_INT) UNLOAD PRIORITY 5 AUTO MERGE ;
INSERT INTO"R"."PRICE"VALUES('Х0002748','LSS-114','черный','L',187583,199808,104646,236624,195156,133067,135994,202429,222394,273780,221541,394626);
INSERT INTO"R"."PRICE"VALUES('Х0002747','LSS-114','черный','M',148110,155382,194232,153623,136995,104904,94258,159147,170040,212846,129887,328977);
INSERT INTO"R"."PRICE"VALUES('Х0002749','LSS-114','черный','XL',134644,175216,116396,148735,175148,90440,77758,133213,171104,202742,186844,275007);
INSERT INTO"R"."PRICE"VALUES('Х0002750','LSS-114','черный','XXL',59099,84636,106513,54266,65838,60712,58999,53699,88121,80810,105075,122517);
INSERT INTO"R"."PRICE"VALUES('Х0002744','BS-224','бежевый','L',7657,48418,83989,72123,83414,45289,3798,93584,78591,82266,102831,100585);
INSERT INTO"R"."PRICE"VALUES('Х0002743','BS-224','бежевый','M',52435,48255,73551,52708,66523,47582,65748,77319,78594,72471,81089,85695);
INSERT INTO"R"."PRICE"VALUES('Х0002746','LSS-114','черный','S',46011,47511,41861,39329,48162,35224,55884,54381,63775,44435,63227,82022);
INSERT INTO"R"."PRICE"VALUES('Х0001306','AB–412','(пусто)','XXXL',9095,8940,null,60065,64289,53167,2178,56296,70890,79707,101258,112189);
INSERT INTO"R"."PRICE"VALUES('Х0002745','BS-224','бежевый','XL',2586,23450,60047,42130,51023,41297,43915,45157,49425,71593,63997,69660);
INSERT INTO"R"."PRICE"VALUES('Х0001395','HEB-999','(пусто)','L_II',10842,4608,19516,null,29816,20871,28114,47164,39465,69390,77794,70800);
INSERT INTO"R"."PRICE"VALUES('Х0002742','BS-224','бежевый','S',9739,28046,34001,24068,31123,20544,11207,46576,41561,37803,39008,48356);
INSERT INTO"R"."PRICE"VALUES('Х0001393','HEB-999','(пусто)','S_I',18431,null,38895,19516,20600,5150,24395,63156,40658,44453,51501,23582);
INSERT INTO"R"."PRICE"VALUES('Х0001390','AB–309','(пусто)','XXXL',23348,21391,null,23247,1266,null,null,16804,12374,14477,27713,55358);
INSERT INTO"R"."PRICE"VALUES('Х0000405','PO-303левый','левый','M',null,null,null,56548,16222,8995,19879,13660,10328,13771,27873,17498);
INSERT INTO"R"."PRICE"VALUES('Х0000408','PO-303правый','правый','M',null,null,null,54160,18832,10883,17769,19435,14592,10061,7439,19291);
INSERT INTO"R"."PRICE"VALUES('Х0000409','PO-303правый','правый','L',null,null,null,46109,22330,4220,13882,3776,5775,9773,27262,9729);
INSERT INTO"R"."PRICE"VALUES('Х0000406','PO-303левый','левый','L',null,null,null,41833,14501,10439,11661,3776,7996,13660,14935,14615);
INSERT INTO"R"."PRICE"VALUES('Х0000407','PO-303правый','правый','S',null,null,null,21233,7562,1999,13993,10328,5952,15992,13493,6219);
INSERT INTO"R"."PRICE"VALUES('Х0000404','PO-303левый','левый','S',null,null,null,27563,16446,4220,15881,14504,10283,5664,null,null);
INSERT INTO"R"."PRICE"VALUES('Х0000412','OA-303правый','(пусто)','ML',null,null,null,40445,3671,2222,5409,3477,5505,3864,3188,3767);
INSERT INTO"R"."PRICE"VALUES('Х0000411','OA-303левый','(пусто)','ML',null,null,null,35375,3671,4154,5409,3477,7340,1642,6955,1835);
INSERT INTO"R"."PRICE"VALUES('Х0000413','OA-303правый','(пусто)','SM',null,null,null,22722,10954,1932,3767,7147,5312,1835,1739,1835);
INSERT INTO"R"."PRICE"VALUES('Х0000410','OA-303левый','(пусто)','SM',null,null,null,22722,5506,1932,1835,3477,7147,7534,1739,2318);
далее пишем процедуру
Code:
SET SCHEMA R;
DROP TYPE T_ABC;
CREATE TYPE T_ABC AS TABLE (
CODE NVARCHAR(20),
DEC INTEGER,
V3 INTEGER,
V4 INTEGER,
V5 NVARCHAR(20));
DROP PROCEDURE ABC;
CREATE PROCEDURE ABC(IN price "R"."PRICE",OUT result T_ABC)LANGUAGE RLANG AS
-- немного необычный синтаксис входящего параметра табличного типа
BEGIN
#в переменную абс записываем процентное значение категорий
abc <-c(30,60)
#считываем колонку CODE и DEC из таблицы
CODE=as.character(price$CODE)
DEC= as.double(price$DEC)
#создаем структуру данных(матрица с разными типами)
m1 =data.frame(CODE,DEC)
# сортировка в обратном порядке по декабрю
k=with(m1, m1[order(-DEC), ])
#в новую третью по счету колонку записываем нарастающий итог
k[,3]=cumsum(k$DEC)
#находим максимальное значение параметр na.rm позволяет игнорировать null
m= max(k$V3,na.rm = TRUE)
#расчет нарастающего итога в процентах
k[,4]=k[,3]/m*100
# выбор категории
k[,5]=ifelse((k[,4]<= abc[1]),'A',ifelse( (k[,4]> abc[2]) ,'C','B' ))
result<-k
END;
DROP PROCEDURE Get_RESULT;
--процедура sql для вызова r
CREATE PROCEDURE Get_RESULT()LANGUAGE SQLSCRIPT AS
BEGIN
PRICE= SELECT * FROM "R"."PRICE" ;
CALL ABC(:PRICE, T1);
SELECT * FROM :T1;
END;
CALL Get_RESULT()
возможно кому- нибудь пригодится