У меня есть приведенный ниже SQL-запрос, который используется для создания отчета по торговым данным на основе ввода пользователя.Пользователь выбирает дату начала и дату окончания для отчета и создает отчет.Там, где обычно находятся переменные, я ввел даты 2018-05-01 и 2018-05-06 для удобства.
Вот основы таблицы, использованной в этом запросе, а также две строки, использованные в примере.
create table activity (
Act_ID int(11),
ACT_QTY int(11),
ACT_PRICE decimal(8,5),
ACT_TRADE_DT date,
ACT_SETTLE_DT date,
ACT_EXTND_SETT varchar(1),
ACT_HOLD_STATUS varchar(140)
);
INSERT INTO activity (ACT_QTY, ACT_PRICE, ACT_TRADE_DT, ACT_SETTLE_DT,
ACT_EXTND_SETT )
VALUES ('10', '103.33', '2018-04-25', '2018-05-02', 'Y'),
('5', '103.40', '2018-04-26', '2018-05-04', 'Y');
Вот запрос, который работает.
SELECT date_query.date_range AS 'Date',
CASE WHEN a.sum_qty is NULL THEN 0 ELSE a.sum_qty END AS 'QTY Sum',
CASE WHEN a.Total_Dollar is NULL THEN 0 ELSE a.Total_Dollar END AS 'Total
Dollar',
CASE WHEN a.Total_Cap_Cost is NULL THEN 0 ELSE a.Total_Cap_Cost END AS 'Total Capital Used'
FROM
(
select sub.date_range from
(select adddate('2001-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0)
date_range from
(select 0 t0 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 t4 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t4) sub
where date_range between '2018-05-01' and '2018-05-06'
) date_query
LEFT OUTER JOIN
(
SELECT ACT_SETTLE_DT, sum( ACT_QTY ) AS 'Sum_QTY', round((ACT_PRICE *
ACT_QTY * 10), 2) AS Total_Dollar, round((ACT_PRICE * ACT_QTY * 10 * .07),2)
AS Total_Cap_Cost FROM activity WHERE ACT_EXTND_SETT = 'Y' AND ACT_HOLD_STATUS !=
'Cancelled' GROUP BY ACT_SETTLE_DT
) a
ON date_query.date_range = a.act_settle_dt
ORDER BY date_query.date_range ASC
Текущий вывод выглядит следующим образом:
2018-05-01 | 0 | 0 | 0
2018-05-02 | 10 |10333.00 | 723.31
2018-05-03 | 0 | 0 | 0
2018-05-04 | 5 | 5170.00 | 361.90
2018-05-05 | 0 | 0 | 0
2018-05-06 | 0 | 0 | 0
Вот где я борюсь.
Я пытаюсь адаптировать текущий запрос для получения скользящей суммы для каждого изстолбцы, когда act_settle_dt меньше, чем date_query.date_range.Вместо суммы (act_qty) для каждой даты мне нужно что-то, что влияет на сумму (act_qty), где act_settle_date
Новый вывод должен выглядеть примерно так:
2018-05-01 | 15 | 15503.00 | 1085.21
2018-05-02 | 15 | 15503.00 | 1085.21
2018-05-03 | 5 | 5170.00 | 361.90
2018-05-04 | 5 | 5170.00 | 361.90
2018-05-05 | 0 | 0 | 0
2018-05-06 | 0 | 0 | 0
Мне нужно, чтобы я мог показать выбранный пользователем период времени количеству и сумме в долларах по каждой сделке, которая еще не рассчитана.
Сервер находится на MySQL 5.6, поэтому использование чего-то вроде предложения OVER не вариант.Я попытался сделать несколько вещей, таких как включение кейса в сумму, но безрезультатно.Я не специалист по SQL, как, вероятно, видно из моего лоскутного запроса, любые рекомендации будут оценены.Спасибо
ОБНОВЛЕНИЕ: Я сузил SQL до следующего.
SELECT date_query.date_range AS 'Date',
CASE WHEN a.sum_qty is NULL THEN 0 ELSE a.sum_qty END AS 'Ext Trade Qty',
CASE WHEN a.Total_Dollar is NULL THEN 0 ELSE a.Total_Dollar END AS 'Total
Dollar',
CASE WHEN a.Total_Cap_Cost is NULL THEN 0 ELSE a.Total_Cap_Cost END AS 'Total
Capital Used',
СУММА (СЛУЧАЙ, КОГДА a.ACT_SETTLE_DT> date_query.date_range THEN a.sum_qty ELSE 0 END) AS 'Накопительное Ext Кол-во'
FROM
(
select sub.date_range from
(select adddate('2001-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0)
date_range from
(select 0 t0 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) sub
where date_range between '2018-05-01' and '2018-05-06'
) date_query
LEFT OUTER JOIN
(
SELECT ACT_TRADE_DT, ACT_SETTLE_DT, sum( ACT_QTY ) AS 'Sum_QTY',
sum(round((ACT_PRICE * ACT_QTY * 10), 2)) AS Total_Dollar,
sum(round((ACT_PRICE * ACT_QTY * 10 * .07),2)) AS Total_Cap_Cost
FROM activity WHERE ACT_EXTND_SETT = 'Y' AND ACT_TRADE_DT <= '2018-05-06'
AND ACT_SETTLE_DT > '2018-05-01'
GROUP BY ACT_SETTLE_DT
) a
ON date_query.date_range = a.act_settle_dt
GROUP BY date_query.date_range
ORDER BY date_query.date_range ASC
Можеткто-нибудь объяснить, почему заблокированный CASE WHEN не работает, как задумано?
Я пытаюсь сравнить даты расчета с текущей датой строки.Я хочу получить сумму всех строк до текущей строки.В этом обновленном коде я получаю значение 0 для накопительного столбца для всех строк.Может кто-нибудь объяснить, почему тот случай, когда не собирают значения при проведении сравнения дат?Или я поступаю об этом совершенно неправильно?