MariaDB 10.1.23, RDS.
Процедура:
delimiter ;;
drop procedure if exists p_GetRTS28Report_Oleg;;
create procedure p_GetRTS28Report_Oleg(IN lp_ClientID int, IN
lp_StartDate date, IN lp_EndDate date,
IN lp_AssetClass varchar(500), IN
lp_ReportType varchar(50),
IN lp_TransactionType varchar(50), IN
lp_InvestorType varchar(50),
IN lp_PrivateFlag bit, IN
lp_ReportingEntity varchar(500))
BEGIN
DECLARE VAR_ExecQty, VAR_OrderCount decimal(18,6);
DROP TEMPORARY TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp (
RunID int,
ClientOrderID varchar(50),
esmaclassid int,
InvestorTypeID char(1),
reporttype varchar(10),
Venue varchar(255),
MarketAccess char(1),
Directed char(1),
ExecutedQuantity decimal(18,6),
NumberOfExecs decimal(18,6),
OrderCount decimal(18,6),
PassiveExecutions decimal(18,6),
AggressiveExecutions decimal(18,6),
PassiveFactor decimal(18,6),
AggressiveFactor decimal(18,6),
OtherFactor decimal(18,6)
) ENGINE = MEMORY;
INSERT INTO temp(RunID, ClientOrderID, esmaclassid, InvestorTypeID, reporttype, Venue, MarketAccess, Directed,
ExecutedQuantity, NumberOfExecs, OrderCount, PassiveExecutions,AggressiveExecutions, PassiveFactor,
AggressiveFactor,OtherFactor)
select r.runid,
rts.orderid,
s.esmaclassid,
rts.InvestorTypeID,
rts.reporttype,
IFNULL(CONCAT(m.mic, ' - ' , m.description),rts.venuedescription) as Venue,
rts.strategyintentid,
rts.isdirected,
round(SUM(rts.volumeexecuted * (rate1.ExchangeRate / rate2.ExchangeRate)), 6) as ExecutedQuantity,
SUM(numberofexecutions) as NumberOfExecs,
COUNT(DISTINCT r.RunID,orderid) AS OrderCnt,
SUM(passiveexecutions) as PassiveExecutions,
SUM(aggressiveexecutions) as AggressiveExecutions,
0,
0,
0
from t_rts28data rts
join t_run r on r.RunID = rts.RunID
join t_security s
on rts.RunID = s.RunID and rts.secid = s.SecurityID
left outer join t_mic m
on rts.venuedescription = m.MIC
LEFT JOIN securitymasterdb.t_currencyconversionrates rate1
ON rate1.CCY = s.CurrencyCode AND rate1.Date = r.TradeDate
LEFT JOIN securitymasterdb.t_currencyconversionrates rate2
ON rate2.CCY = 'EUR' AND rate2.Date = r.TradeDate
where r.tradedate between lp_StartDate and lp_EndDate
and r.clientid = lp_ClientID
and r.isactive = 1
and r.ProductID = 3
and s.esmaclassid = lp_AssetClass
and rts.reporttype = lp_ReportType
and rts.transactiontypeid = lp_TransactionType
and IFNULL(rts.investortypeid,'~~~') = IFNULL(lp_InvestorType,'~~~')
and rts.isexception IS NULL
and IFNULL(UPPER(rts.reportingentity), '~~~~~~~~~~~~~')=IFNULL(UPPER(lp_ReportingEntity), '~~~~~~~~~~~~~')
GROUP BY r.runid,rts.orderid,s.esmaclassid, rts.InvestorTypeID, rts.reporttype, m.mic, m.description,
rts.venuedescription,rts.strategyintentid, rts.isdirected;
SELECT SUM(ExecutedQuantity), SUM(OrderCount) INTO VAR_ExecQty, VAR_OrderCount FROM temp;
IF lp_ReportType = 'RTS28' THEN
UPDATE temp
SET PassiveFactor = IF(Directed = 'D', 0, ifnull(PassiveExecutions / NumberOfExecs * OrderCount, 0)),
AggressiveFactor = IF(Directed = 'D', 0, IFNULL(AggressiveExecutions / NumberOfExecs * OrderCount,0));
ELSE
UPDATE temp
SET PassiveFactor = IFNULL(CASE
WHEN Directed = 'D' THEN 0
WHEN MarketAccess = 'P' AND NumberOfExecs = 0 THEN OrderCount
ELSE (PassiveExecutions / NumberOfExecs) * OrderCount
END,0),
AggressiveFactor = IFNULL(CASE
WHEN Directed = 'D' THEN 0
WHEN MarketAccess = 'A' AND NumberOfExecs = 0 THEN OrderCount
ELSE (AggressiveExecutions / NumberOfExecs) * OrderCount
END,0);
END IF;
IF (lp_PrivateFlag = 0) THEN -- public
select Venue,
CAST(IFNULL(ExecutedQuantity/NULLIF(VAR_ExecQty,0) * 100,0) as DECIMAL(18, 6)) as VolumePct,
CAST(IFNULL(OrderCnt / NULLIF(VAR_OrderCount,0) * 100,0) as DECIMAL(18,6)) as OrderPct,
CAST(IFNULL(PassiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as PassivePct,
CAST(IFNULL(AggressiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18,6)) as AggressivePct,
CAST(IFNULL(DirectCnt / NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as DirectedPct,
PassiveCnt,
AggressiveCnt,
DirectCnt,
OrderCnt,
VolumeExecuted,
NumberOfExecs,
lp_ReportType AS ReportType,
lp_TransactionType AS TransactionType,
lp_InvestorType AS InvestorType,
PassiveCnt as pf,
AggressiveCnt as af
from (
SELECT
Venue,
SUM(ExecutedQuantity) as ExecutedQuantity,
SUM(PassiveFactor) as PassiveCnt,
SUM(AggressiveFactor) as AggressiveCnt,
SUM(CASE WHEN Directed = 'D'
THEN OrderCount
ELSE 0 END) as DirectCnt,
SUM(OrderCount) as OrderCnt,
SUM(ExecutedQuantity) as VolumeExecuted,
SUM(NumberOfExecs) as NumberOfExecs
FROM temp t1
GROUP BY Venue
) t1
ORDER BY VolumeExecuted DESC, Venue
LIMIT 5;
ELSE -- private
select Venue,
CAST(IFNULL(ExecutedQuantity/NULLIF(VAR_ExecQty,0) * 100,0) as DECIMAL(18, 6)) as VolumePct,
CAST(IFNULL(OrderCnt / NULLIF(VAR_OrderCount,0) * 100,0) as DECIMAL(18,6)) as OrderPct,
CAST(IFNULL(PassiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as PassivePct,
CAST(IFNULL(AggressiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18,6)) as AggressivePct,
CAST(IFNULL(DirectCnt / NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as DirectedPct,
PassiveCnt,
AggressiveCnt,
DirectCnt,
OrderCnt,
VolumeExecuted,
NumberOfExecs,
lp_ReportType AS ReportType,
lp_TransactionType AS TransactionType,
lp_InvestorType AS InvestorType,
PassiveCnt as pf,
AggressiveCnt as af
from (
SELECT
Venue,
SUM(ExecutedQuantity) as ExecutedQuantity,
SUM(PassiveFactor) as PassiveCnt,
SUM(AggressiveFactor) as AggressiveCnt,
SUM(CASE WHEN Directed = 'D'
THEN OrderCount
ELSE 0 END) as DirectCnt,
SUM(OrderCount) as OrderCnt,
SUM(ExecutedQuantity) as VolumeExecuted,
SUM(NumberOfExecs) as NumberOfExecs
FROM temp t1
GROUP BY Venue
) t1
ORDER BY VolumeExecuted DESC, Venue;
END IF;
DROP TEMPORARY TABLE IF EXISTS temp;
END;
delimiter ;
На запуске типа:
call tca.p_GetRTS28Report_Oleg(105, '2017-01-01', '2017-12-31', 10, '65.6', 'REG', 'P', 1, 'BFM-656');
Выдает ошибку синтаксиса. Проверил всё, что мог, ошибки не вижу в упор.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
можно ли в столбце из строки: 10,13,18/12:00:00/15:55:00 извлечь первые 3 цифры до символа '/' ? то есть мне надо что бы оператор LIKE сравнивал только (10,13,18),...
есть массив, после прохождения по массиву циклом foreach нужно определить первую запись к примеру: