Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Инициализация пользовательской переменной / 13 сообщений из 13, страница 1 из 1
24.10.2014, 10:15:14
    #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
24.10.2014, 10:20:35
    #38786355
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
KSVSVK
Код: sql
1.
2.
from Invest A
left join Invest B on true

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

Этот Join обеспечивает перебор всех инвесторов вне зависимости от того, был у них ввод-вывод средств в данный день или нет. Если его убрать, то часть строк результата будет убрано, а это неудобно в дальнейшем.
...
Рейтинг: 0 / 0
24.10.2014, 11:29:28
    #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
24.10.2014, 12:34:46
    #38786527
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
а если прсото отправить команду инициализации переменой?


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

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

from Invest, (@S := 0)
...
Рейтинг: 0 / 0
24.10.2014, 12:42:01
    #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
24.10.2014, 12:49:30
    #38786557
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
Код: sql
1.
from Invest A, Invest B, (SELECT @S := 0) dummy
...
Рейтинг: 0 / 0
24.10.2014, 12:58:36
    #38786576
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
KSVSVKЭтот Join обеспечивает перебор всех инвесторов вне зависимости от того, был у них ввод-вывод средств в данный день или нет.Для этого лучше использовать опорную таблицу дат. Имхо.
...
Рейтинг: 0 / 0
24.10.2014, 15:11:03
    #38786721
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
KSVSVK,

Вопрос -- какова логика обнуления @S ?
Только на Delta=NULL ? МОгут ли все Делта быть
не нул и сумма накапливается все время?
...
Рейтинг: 0 / 0
24.10.2014, 15:59:00
    #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
24.10.2014, 16:28:06
    #38786825
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация пользовательской переменной
KSVSVKВот только сам результат при этом неправильныйНаверное, потому, что логика запроса не соответствует требуемой?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Инициализация пользовательской переменной / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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