Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Накопительная сумма / 9 сообщений из 9, страница 1 из 1
20.10.2014, 16:39:46
    #38782066
KSVSVK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
Есть таблица:

+------------+----------+--------+
| data | investor | delta |
+------------+----------+--------+
| 2014-10-10 | 1 | 100.00 |
| 2014-10-11 | 0 | -20.00 |
| 2014-10-12 | 2 | 200.00 |
| 2014-10-12 | 1 | -50.00 |
| 2014-10-13 | 0 | 50.00 |
| 2014-10-14 | 3 | 150.00 |
+------------+----------+--------+

Требуется подсчитать сумму дельт каждого инвестора за весь период от первой до текущей даты.

Пытался делать так:

Код: sql
1.
2.
3.
4.
5.
select A.Data, B.Investor, sum(C.Delta)
from Invest A
left join Invest B on true
left join Invest C on C.Investor = B.Investor and C.Data <= A.Data
group by A.Data, B.Investor;



В результате получил:

+------------+----------+--------------+
| Data | Investor | sum(C.Delta) |
+------------+----------+--------------+
| 2014-10-10 | 0 | NULL |
| 2014-10-10 | 1 | 200.00 |
| 2014-10-10 | 2 | NULL |
| 2014-10-10 | 3 | NULL |
| 2014-10-11 | 0 | -40.00 |
| 2014-10-11 | 1 | 200.00 |
| 2014-10-11 | 2 | NULL |
| 2014-10-11 | 3 | NULL |
| 2014-10-12 | 0 | -80.00 |
| 2014-10-12 | 1 | 200.00 |
| 2014-10-12 | 2 | 400.00 |
| 2014-10-12 | 3 | NULL |
| 2014-10-13 | 0 | 60.00 |
| 2014-10-13 | 1 | 100.00 |
| 2014-10-13 | 2 | 200.00 |
| 2014-10-13 | 3 | NULL |
| 2014-10-14 | 0 | 60.00 |
| 2014-10-14 | 1 | 100.00 |
| 2014-10-14 | 2 | 200.00 |
| 2014-10-14 | 3 | 150.00 |
+------------+----------+--------------+

Структура первых двух столбцов верная. Значения NULL в третьем на нужных местах, но вот сами суммы неверные. Они как минимум удвоились. Что я не так делаю?
...
Рейтинг: 0 / 0
20.10.2014, 18:31:17
    #38782176
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
KSVSVKТребуется подсчитать сумму дельт каждого инвестора за весь период от первой до текущей датыэээ...
Код: sql
1.
2.
3.
4.
select Investor, sum(Delta)
from Invest
where <условие на период, которое вы вообще забыли>
group by A.Data;
...
Рейтинг: 0 / 0
21.10.2014, 04:11:40
    #38782386
KSVSVK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
автор
Код: sql
1.
2.
3.
4.
select Investor, sum(Delta)
from Invest
where <условие на период, которое вы вообще забыли>
group by A.Data;



Подобный Select вообще не сработает, ибо в group by стоит поле, которого в Select нет. Но даже с этим исправлением он даст суммы за каждый день, а не за требуемый период.

Если запрос переписать так:

Код: sql
1.
2.
3.
4.
5.
6.
select A.Data, B.Investor, sum(C.Delta)
from Invest A
left join Invest B on true
left join Invest C on C.Investor = B.Investor
where C.Data <= A.Data
group by A.Data, B.Investor;



то результат опять неправильный:

+------------+----------+--------------+
| Data | Investor | sum(C.Delta) |
+------------+----------+--------------+
| 2014-10-10 | 1 | 200.00 |
| 2014-10-11 | 0 | -40.00 |
| 2014-10-11 | 1 | 200.00 |
| 2014-10-12 | 0 | -80.00 |
| 2014-10-12 | 1 | 80.00 |
| 2014-10-12 | 2 | 400.00 |
| 2014-10-13 | 0 | 60.00 |
| 2014-10-13 | 1 | 40.00 |
| 2014-10-13 | 2 | 200.00 |
| 2014-10-14 | 0 | 60.00 |
| 2014-10-14 | 1 | 40.00 |
| 2014-10-14 | 2 | 200.00 |
| 2014-10-14 | 3 | 150.00 |
+------------+----------+--------------+

Предыдущий был ближе к истине.
...
Рейтинг: 0 / 0
21.10.2014, 12:17:03
    #38782675
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
KSVSVK, ну да, ошибся, группировать надо, естественно, по инвестору.
KSVSVKПодобный Select вообще не сработает, ибо в group by стоит поле, которого в Select нетв мускле-то? сработает, ещё как. другое дело, что вернёт он чепуху, это да.
...
Рейтинг: 0 / 0
21.10.2014, 16:37:50
    #38783193
KSVSVK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
В том-то и дело, что мне нужны не итоговые суммы по инвесторам, а процесс их накопления, т.е. суммы, накопленные инвесторами на каждый день.
...
Рейтинг: 0 / 0
22.10.2014, 05:05:36
    #38783574
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
KSVSVK, так с этого и надо было начинать.
Код: sql
1.
2.
3.
4.
select investor,dt
 ,(select sum(delta) from invest where investor=i.investor and dt<=i.dt)
from invest i
order by 1,2



Код: sql
1.
2.
3.
4.
select i.investor,i.dt,sum(i2.delta)
from invest i
join invest i2 on i.investor=i2.investor and i.dt>=i2.dt
group by 1,2



ну и условие на начальную дату, естественно
...
Рейтинг: 0 / 0
22.10.2014, 06:38:07
    #38783588
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
как вариант -- посмотрите Ф.А.К темы
по выборке ТОП-10 и по нумерации записей.

идея в создании переменной с набегаюшей суммой --
при смене инжестора сумма обнуляется и снова
накапливается от записи к записи.

Это грамчик сложнее, но быстрее (скорее всего).
...
Рейтинг: 0 / 0
22.10.2014, 10:43:15
    #38783751
KSVSVK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
tanglir, спасибо!

Сделал на основе предложенного Вами варианта, слегка его изменив:

Код: sql
1.
2.
3.
4.
5.
6.
select A.Data, B.Investor, 
(select sum(Delta) from invest
 where Investor = B.Investor and (Data < A.Data or (Data = A.Data and Delta > 0)))
from Invest A
left join Invest B on true
group by A.Data, B.Investor;
...
Рейтинг: 0 / 0
22.10.2014, 11:06:17
    #38783794
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Накопительная сумма
KSVSVK, всё-таки не понимаю, зачем вы таблицу множите саму на себя, а затем группируете - лишняя дурная работа для сервера...
А то, что из последнего дня минусы не брать, а брать только плюсы
Код: sql
1.
(Data < A.Data or (Data = A.Data and Delta > 0))

вообще в условии не было оговорено.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Накопительная сумма / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]