powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Инициализация пользовательской переменной
13 сообщений из 13, страница 1 из 1
Инициализация пользовательской переменной
    #38786348
KSVSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть составной запрос, на основе которого планируется создание View:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select A.Data,
 (select sum(Delta) from Invest
  where Data < A.Data or (Data = A.Data and Delta > 0)) as Common,
 B.Investor,
 (select sum(Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta > 0) as Inv_In,
 (select sum(-Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta < 0) as Inv_Out,
 (select @S := format(ifnull(@S, 0) + Sum(Delta), 2) from Invest
   where Investor = B.Investor and(Data < A.Data or(Data = A.Data and Delta > 0))) as S
from Invest A
left join Invest B on true
group by A.Data, B.Investor;



Инвестор с номером 0 -- управляющий. Эти деньги должны распределяться между остальными пропорционально их текущим суммам. В этих суммах должен учитываться доход от предыдущих действий управляющего. Чтобы такие суммы посчитать введена переменная @S.

При первом выполнении запроса все значения правильные:

+------------+--------+----------+--------+---------+--------+
| Data | Common | Investor | Inv_In | Inv_Out | S |
+------------+--------+----------+--------+---------+--------+
| 2014-10-10 | 100.00 | 0 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 1 | 100.00 | NULL | 100.00 |
| 2014-10-10 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 0 | NULL | 20.00 | NULL |
| 2014-10-11 | 100.00 | 1 | NULL | NULL | 100.00 |
| 2014-10-11 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-12 | 280.00 | 0 | NULL | NULL | -20.00 |
| 2014-10-12 | 280.00 | 1 | NULL | 80.00 | 100.00 |
| 2014-10-12 | 280.00 | 2 | 200.00 | NULL | 200.00 |
| 2014-10-12 | 280.00 | 3 | NULL | NULL | NULL |
| 2014-10-13 | 250.00 | 0 | 50.00 | NULL | 30.00 |
| 2014-10-13 | 250.00 | 1 | NULL | NULL | 20.00 |
| 2014-10-13 | 250.00 | 2 | NULL | NULL | 200.00 |
| 2014-10-13 | 250.00 | 3 | NULL | NULL | NULL |
| 2014-10-14 | 400.00 | 0 | NULL | NULL | 30.00 |
| 2014-10-14 | 400.00 | 1 | NULL | NULL | 20.00 |
| 2014-10-14 | 400.00 | 2 | NULL | NULL | 200.00 |
| 2014-10-14 | 400.00 | 3 | 150.00 | NULL | 150.00 |
+------------+--------+----------+--------+---------+--------+

А вот при повторных начинается бред:

+------------+--------+----------+--------+---------+--------+
| Data | Common | Investor | Inv_In | Inv_Out | S |
+------------+--------+----------+--------+---------+--------+
| 2014-10-10 | 100.00 | 0 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 1 | 100.00 | NULL | 200.00 |
| 2014-10-10 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 0 | NULL | 20.00 | NULL |
| 2014-10-11 | 100.00 | 1 | NULL | NULL | 610.00 |
| 2014-10-11 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-12 | 280.00 | 0 | NULL | NULL | -20.00 |
| 2014-10-12 | 280.00 | 1 | NULL | 80.00 | 200.00 |
| 2014-10-12 | 280.00 | 2 | 200.00 | NULL | 400.00 |
| 2014-10-12 | 280.00 | 3 | NULL | NULL | NULL |
| 2014-10-13 | 250.00 | 0 | 50.00 | NULL | 30.00 |
| 2014-10-13 | 250.00 | 1 | NULL | NULL | 120.00 |
| 2014-10-13 | 250.00 | 2 | NULL | NULL | 320.00 |
| 2014-10-13 | 250.00 | 3 | NULL | NULL | NULL |
| 2014-10-14 | 400.00 | 0 | NULL | NULL | 460.00 |
| 2014-10-14 | 400.00 | 1 | NULL | NULL | 80.00 |
| 2014-10-14 | 400.00 | 2 | NULL | NULL | 280.00 |
| 2014-10-14 | 400.00 | 3 | 150.00 | NULL | 430.00 |
+------------+--------+----------+--------+---------+--------+

Как я понимаю, это связано с тем, что в переменной @S остается значение от предыдущего запроса. Как с этим бороться?
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786355
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KSVSVK
Код: sql
1.
2.
from Invest A
left join Invest B on true

таки я ещё раз поинтересуюсь - зачем вам тут этот джойн? особенно в свете написанного в секции "групбай".
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786436
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KSVSVKКак я понимаю, это связано с тем, что в переменной @S остается значение от предыдущего запроса. Как с этим бороться?Пральна понимаешь. Инициализировать-то значение за тебя кто будет?
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786444
KSVSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Этот Join обеспечивает перебор всех инвесторов вне зависимости от того, был у них ввод-вывод средств в данный день или нет. Если его убрать, то часть строк результата будет убрано, а это неудобно в дальнейшем.
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786456
KSVSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Вот я и не могу понять, как его инициализировать. Пробовал так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select A.Data, @S := 0,
 (select sum(Delta) from Invest
  where Data < A.Data or (Data = A.Data and Delta > 0)) as Common,
 B.Investor,
 (select sum(Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta > 0) as Inv_In,
 (select sum(-Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta < 0) as Inv_Out,
 (select @S := format(ifnull(@S, 0) + Sum(Delta), 2) from Invest
   where Investor = B.Investor and(Data < A.Data or(Data = A.Data and Delta > 0))) as S
from Invest A
left join Invest B on true
group by A.Data, B.Investor;



Получилась чушь.
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786527
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если прсото отправить команду инициализации переменой?


а вообще логично, если инициализировать переменную в секции селект(секция которая выполняеться для каждой строкит) то будет чушь.

надо в секции фром
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786531
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
from Invest -----

from Invest, (@S := 0)
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786539
KSVSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

Если так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select A.Data,
 (select sum(Delta) from Invest
  where Data < A.Data or (Data = A.Data and Delta > 0)) as Common,
 B.Investor,
 (select sum(Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta > 0) as Inv_In,
 (select sum(-Delta) from Invest
  where Investor = B.Investor and Data = A.Data and Delta < 0) as Inv_Out,
 (select @S := format(ifnull(@S, 0) + Sum(Delta), 2) from Invest
   where Investor = B.Investor and(Data < A.Data or(Data = A.Data and Delta > 0))) S
from Invest A, (@S := 0)
left join Invest B on true
group by A.Data, B.Investor;



то выдает ошибку

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '@S :=
0)
left join Invest B on true
group by A.Data, B.Investor' at line 11
mysql>
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786557
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
from Invest A, Invest B, (SELECT @S := 0) dummy
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786576
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KSVSVKЭтот Join обеспечивает перебор всех инвесторов вне зависимости от того, был у них ввод-вывод средств в данный день или нет.Для этого лучше использовать опорную таблицу дат. Имхо.
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786721
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KSVSVK,

Вопрос -- какова логика обнуления @S ?
Только на Delta=NULL ? МОгут ли все Делта быть
не нул и сумма накапливается все время?
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786788
KSVSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ваш вариант обеспечивает стабильность результата. Вот только сам результат при этом неправильный :(
Буду разбираться почему.

mysql> select A.Data,
-> (select sum(Delta) from Invest
-> where Data < A.Data or (Data = A.Data and Delta > 0)) as Common,
-> B.Investor,
-> (select sum(Delta) from Invest
-> where Investor = B.Investor and Data = A.Data and Delta > 0) as Inv_In,

-> (select sum(-Delta) from Invest
-> where Investor = B.Investor and Data = A.Data and Delta < 0) as Inv_Out
,
-> (select @S := format(ifnull(@S, 0) + Sum(Delta), 2) from Invest
-> where Investor = B.Investor and(Data < A.Data or(Data = A.Data and Del
ta > 0))) S
-> from Invest A, Invest B, (select @S := 0) dummy
-> group by A.Data, B.Investor;
+------------+--------+----------+--------+---------+--------+
| Data | Common | Investor | Inv_In | Inv_Out | S |
+------------+--------+----------+--------+---------+--------+
| 2014-10-10 | 100.00 | 0 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 1 | 100.00 | NULL | 100.00 |
| 2014-10-10 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-10 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 0 | NULL | 20.00 | NULL |
| 2014-10-11 | 100.00 | 1 | NULL | NULL | 350.00 |
| 2014-10-11 | 100.00 | 2 | NULL | NULL | NULL |
| 2014-10-11 | 100.00 | 3 | NULL | NULL | NULL |
| 2014-10-12 | 280.00 | 0 | NULL | NULL | -20.00 |
| 2014-10-12 | 280.00 | 1 | NULL | 50.00 | 200.00 |
| 2014-10-12 | 280.00 | 2 | 200.00 | NULL | 200.00 |
| 2014-10-12 | 280.00 | 3 | NULL | NULL | NULL |
| 2014-10-13 | 280.00 | 0 | 50.00 | NULL | 30.00 |
| 2014-10-13 | 280.00 | 1 | NULL | NULL | 400.00 |
| 2014-10-13 | 280.00 | 2 | NULL | NULL | 200.00 |
| 2014-10-13 | 280.00 | 3 | NULL | NULL | NULL |
| 2014-10-14 | 430.00 | 0 | NULL | NULL | 10.00 |
| 2014-10-14 | 430.00 | 1 | NULL | NULL | 250.00 |
| 2014-10-14 | 430.00 | 2 | NULL | NULL | 400.00 |
| 2014-10-14 | 430.00 | 3 | 150.00 | NULL | 150.00 |
+------------+--------+----------+--------+---------+--------+
...
Рейтинг: 0 / 0
Инициализация пользовательской переменной
    #38786825
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KSVSVKВот только сам результат при этом неправильныйНаверное, потому, что логика запроса не соответствует требуемой?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Инициализация пользовательской переменной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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