Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / объявление переменной в SQL-запросе / 16 сообщений из 16, страница 1 из 1
19.02.2014, 21:15:57
    #38566806
alex_kos_82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Приветствую всех!
Ребят не поможете советом. Имеется следующий запрос, приведенный ниже. В нем есть часть кода для создания вычислительных полей, которая используется многократно (расчет числа дней между двумя датами). Вопрос в следующем, можно ли как то в запросе объявить переменную, и в последующем её использовать для создания задания формулы вычислительных полей? (такой вариант существенно облегчит написание в моем случае кода вычислительных полей).
Заранее спасибо за ответ!


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
select

id_deposit,
invDep.type_invest,  /* тип инвестора */
invDep.id_exch, /* идентификатор валюты, в которой сделан вклад */  
invDep.id_invest, /* идентификатор инвестора, сделавшего вклад */
status_deposit, /* статус вклада (0-открыт, 1-закрыт) */
date_open, /* дата открытия вклада*/
name_bank, /* название банка, в котором был открыт вклад*/
adr_bank, /* адрес банка*/
dep_name, /* название вклада*/
dep_time, /* срок вклада*/
proc_profit, /* процентная ставка по вкладу*/
proc_nalog, /* налоговая ставка*/
dep_value_exch, /* размер депозита в валюте вклада*/

 /* вычисляемые поля */
(dep_value_exch*rate_exch) as calc_dep_value_rub, /*размер депозита в рублях */
rate_exch as calc_rate_exch, /* катировки валюты */
((DATEDIFF(CURDATE(), date_open))*proc_profit/365) as calc_result_proc, /* размер начисленных процентов*/
((DATEDIFF(CURDATE(), date_open) *proc_profit/365)/100)*dep_value_exch as calc_result_exch,  /* размер начислений в валюте вклада*/
(((DATEDIFF(CURDATE(), date_open) *proc_profit/365)/100)*dep_value_exch) * rate_exch as calc_result_rub, /* размер начислений в рублях*/
(proc_nalog/100) * ((((DATEDIFF(CURDATE(), date_open) *proc_profit/365)/100)*dep_value_exch) * rate_exch) as calc_result_nalog, /* размер взымаемого в рублях*/


 /* поисковые поля */
tiker_exch as find_tiker_exch,
fiz_familia as find_fiz_familia,
fiz_name as find_fiz_name,
fiz_otchestvo as find_fiz_otchestvo,
fiz_born_date as find_fiz_born_date,
ur_comp_name as find_ur_comp_name

from investor_deposits invDep, exchange exch, investor inv
where exch.id_exch= invDep.id_exch and inv.id_invest= invDep.id_invest
...
Рейтинг: 0 / 0
19.02.2014, 21:24:27
    #38566811
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Часть запроса, которая производит "базовые" вычисления, уберите в подзапрос.

Переменными делать желаемое не рекомендую, т.к. (насколько я помню) в секции SELECT порядок вычисления выражений не гарантирован.
...
Рейтинг: 0 / 0
20.02.2014, 08:44:03
    #38567010
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
miksoft,

... но пока соблюдается. Чего уже нельзя сказать об остальных частях. Завязываться на порядок (даже вычислений переменных) в sql надо ваще с большой опаской.
Я бы так сказал. :)
...
Рейтинг: 0 / 0
20.02.2014, 12:15:46
    #38567321
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Arhat109... но пока соблюдается.Могу ошибаться, но вроде бы на форуме были вопросы со странными глюками, которые по симптомам были похожи на неверный порядок вычисления переменных в секции SELECT. Вылечилось именно переходом к подзапросу.
...
Рейтинг: 0 / 0
20.02.2014, 13:51:11
    #38567498
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
miksoft,

не знаю, но я не сталкивался и, насколько помню код (смотрел года полтора назад и поверхностно), то там вроде как нечему переставлять порядок, разве что подзапросы в селекте, но после попадалова на глюк (писал тут давненько - окончательно так и не понял в чём было дело) - стараюсь их не использовать в этой части. Вот секция where ...

В целом - соглашусь, что если можно ввести подзапрос, то лучше с ним чем без него. Особенно если в нем можно существенно ограничить выборку.
...
Рейтинг: 0 / 0
20.02.2014, 19:49:31
    #38568018
alex_kos_82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Спасибо за подсказку! miksoft а на примере показать не можете? Что собой будет представлять данный подзапрос, содержащий в себе эти базовые вычисления?
...
Рейтинг: 0 / 0
22.02.2014, 07:52:58
    #38569297
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
miksoftArhat109... но пока соблюдается.Могу ошибаться, но вроде бы на форуме были вопросы со странными глюками, которые по симптомам были похожи на неверный порядок вычисления переменных в секции SELECT. Вылечилось именно переходом к подзапросу.

на моей памяти -- никто никогда не показал непоследовательного
порядка вычисления в SELEСT секции. В литературе и на форуме
многие отмечали что по ГОСТУ СКЛ стандарту порядок
не определен и MYSQL это не обешает. Но дефакто порядок держится,
и я лично это использую годами и не видел ни единого сбоя.

Совершено другое -- порядок вычисления WHERE секции,
там это вообше нельзя делать ибо показаны несколько случаев
что наличие или отсутсвие индекса менят и порядок вычисления
рекордов и порядок вычисления отдельных условий.

Т.е. в WHERE вообше переменные использовать запрешено
(кроме bochkov-у)
...
Рейтинг: 0 / 0
22.02.2014, 08:25:20
    #38569303
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
javajdbc, подправлю чуток:

... использовать - можно и в секции "вера"... вычислять опасно (не всё "можно"), и порядок вычислений задавать явно через least(), greatest(). Ну и ещё надо помнить, что секция "Веры" может отрабатывать в запросе столько раз ... сколько имеем соединений, а то и по 2 на каждое! Может получиться повторное вычисление или "дороговастенько".
...
Рейтинг: 0 / 0
22.02.2014, 09:06:53
    #38569310
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
alex_kos_82,

А что бы тебе не использовать для хранения полей, которые потом будут многократно использоваться, таблицы с временными данными вместо переменных?

Такая светлая мысль не приходила тебе в голову?
...
Рейтинг: 0 / 0
22.02.2014, 14:00:06
    #38569405
alex_kos_82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
MasterZiv спасибо за идею. Но получается что предварительно для каждой записи необходимо будет выполнять обновление этих временных данных. А это уже мне кажется лишние операции.
...
Рейтинг: 0 / 0
22.02.2014, 14:12:23
    #38569413
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
alex_kos_82Спасибо за подсказку! miksoft а на примере показать не можете? Что собой будет представлять данный подзапрос, содержащий в себе эти базовые вычисления?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
select
t.*,
calc_result_proc/100*dep_value_exch as calc_result_exch,  /* размер начислений в валюте вклада*/
calc_result_proc/100*dep_value_exch*rate_exch as calc_result_rub, /* размер начислений в рублях*/
(proc_nalog/100) * (calc_result_proc/100)*dep_value_exch * rate_exch as calc_result_nalog, /* размер взымаемого в рублях*/
FROM 
(SELECT
id_deposit,
invDep.type_invest,  /* тип инвестора */
invDep.id_exch, /* идентификатор валюты, в которой сделан вклад */  
invDep.id_invest, /* идентификатор инвестора, сделавшего вклад */
status_deposit, /* статус вклада (0-открыт, 1-закрыт) */
date_open, /* дата открытия вклада*/
name_bank, /* название банка, в котором был открыт вклад*/
adr_bank, /* адрес банка*/
dep_name, /* название вклада*/
dep_time, /* срок вклада*/
proc_profit, /* процентная ставка по вкладу*/
proc_nalog, /* налоговая ставка*/
dep_value_exch, /* размер депозита в валюте вклада*/

 /* вычисляемые поля */
(dep_value_exch*rate_exch) as calc_dep_value_rub, /*размер депозита в рублях */
rate_exch as calc_rate_exch, /* катировки валюты */
DATEDIFF(CURDATE(), date_open)*proc_profit/365 as calc_result_proc, /* размер начисленных процентов*/

 /* поисковые поля */
tiker_exch as find_tiker_exch,
fiz_familia as find_fiz_familia,
fiz_name as find_fiz_name,
fiz_otchestvo as find_fiz_otchestvo,
fiz_born_date as find_fiz_born_date,
ur_comp_name as find_ur_comp_name

from investor_deposits invDep, exchange exch, investor inv
where exch.id_exch= invDep.id_exch and inv.id_invest= invDep.id_invest) t

В скобках мог напутать, но идея, надеюсь, ясна.
...
Рейтинг: 0 / 0
22.02.2014, 18:42:03
    #38569556
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
alex_kos_82MasterZiv спасибо за идею. Но получается что предварительно для каждой записи необходимо будет выполнять обновление этих временных данных. А это уже мне кажется лишние операции.

Это дешево.
...
Рейтинг: 0 / 0
23.02.2014, 08:30:43
    #38569720
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Имеется следующий запрос, приведенный ниже. В нем есть часть кода для создания вычислительных полей, которая используется многократно (расчет числа дней между двумя датами). Вопрос в следующем, можно ли как то в запросе объявить переменную, и в последующем её использовать для создания задания формулы вычислительных полей?


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

То, что тебе нужно, называется VIEW.
Ты один раз его напишешь, потом будет пользоваться, даже в разных запросах.

Только учти одну вещь: в запросах с использованием этого view в фильтрах и join нельзя будет использовать эти выставляемые поля, их можно только использовать в списке вывода или для других полей с выражениями на из основе.
...
Рейтинг: 0 / 0
23.02.2014, 08:45:47
    #38569721
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Ещё подошло бы CTE для этого, но mySQL его не умеет. Альтернатива — derived table, он же inline view, — т.е. подзапос во FROM, как уже указал miksoft. Это все на случай если нужно это только в одном запросе.
...
Рейтинг: 0 / 0
24.02.2014, 14:24:31
    #38570477
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
Модератор: Закончили ругаться? зачищаю...
...
Рейтинг: 0 / 0
24.02.2014, 18:32:54
    #38570816
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
объявление переменной в SQL-запросе
miksoft,

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


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