Скользящая сумма SQL для каждой даты - PullRequest
0 голосов
/ 01 июня 2018

У меня есть приведенный ниже 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 для накопительного столбца для всех строк.Может кто-нибудь объяснить, почему тот случай, когда не собирают значения при проведении сравнения дат?Или я поступаю об этом совершенно неправильно?

1 Ответ

0 голосов
/ 04 июня 2018

После долгих проб и ошибок я отказался от метода CASE.

SUM(CASE WHEN a.ACT_SETTLE_DT > date_query.date_range THEN a.sum_qty ELSE 0 END ) AS 'Cumulative Ext Qty'

Я наконец смог прийти к ответу, используя подзапрос, сравнивая даты внутри предложения WHERE.Кажется, достаточно просто, и я подумал, что так и будет.Если у кого-то есть более чистый / простой вариант, не стесняйтесь писать.

(SELECT SUM(ACT_QTY)
    FROM activity A2
    where A2.ACT_TRADE_DT <= date_query.date_range and
          A2.ACT_SETTLE_DT >= date_query.date_range
   ) as 'Cumulative Sum',
(SELECT SUM(round((ACT_PRICE * ACT_QTY * 10), 2))
    FROM activity A2
    where A2.ACT_TRADE_DT <= date_query.date_range and
          A2.ACT_SETTLE_DT >= date_query.date_range
   ) as 'Cumulative Total Dollar',
(SELECT SUM(round((ACT_PRICE * ACT_QTY * 10 * .07),2))
    FROM activity A2
    where A2.ACT_TRADE_DT <= date_query.date_range and
          A2.ACT_SETTLE_DT >= date_query.date_range
   ) as 'Cumululative Cap Total'

Результирующий набор отображается так, как задумано.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...