powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите правильно оформить запрос?
33 сообщений из 33, показаны все 2 страниц
Помогите правильно оформить запрос?
    #38398471
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня проблемы с этим запросом:

Код: 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.
SELECT
	s1.id,
	s1.num_sale AS номер_продажи,
	s1.agreed AS agreed,
	s1.in_delivered AS in_delivered,
	s1.out_delivered AS out_delivered,
	s1.paid AS paid,
	s1.sale_ok AS sale_ok,
	s1.client AS клиент,
	s1.city AS город,
	s1.phone AS контактный_телефон,
	s1.email AS email,
	@скидка_процентная:= IF(s1.discount_percent <> null, s1.discount_percent, 0) AS скидка_процентная,
	@скидка_денежная:= IF(s1.discount_money <> null, s1.discount_money, 0) AS скидка_денежная,
	s1.managers AS менеджеры,
	s1.count_managers AS кол_менеджеров,
	IF(@скидка_процентная <> 0, @скидка_процентная, IF(@скидка_денежная <> 0, @скидка_денежная, 0)) AS скидка,
	@тип_скидки:= IF(@скидка_процентная <> 0, "percent", IF(@скидка_денежная <> 0, "money", "false")) AS тип_скидки,
	@ндс:= IF(s1.vat_sale <> null, s1.vat_sale, 0) AS ндс,
	@ндс_процент:= (1 + (@ндс / 100)) AS ндс_процент,
	@кол_тов:= (SELECT COUNT(id) FROM sale_prod WHERE num_sale = s1.num_sale) AS кол_тов,
	@кол_ед:= (SELECT SUM(count_products) FROM sale_prod WHERE num_sale = s1.num_sale) AS кол_ед,
	@всего_закупка:= (SELECT SUM(purchase_price_product * count_products * (1 + (vat_product / 100))) FROM sale_prod WHERE num_sale = s1.num_sale) AS всего_закупка,
	@цена_всего_без_скидки_без_ндс:= (SELECT SUM(sale_price_product * count_products) FROM sale_prod WHERE num_sale = s1.num_sale) AS цена_всего_без_скидки_без_ндс,
	@цена_всего_без_скидки:= (@цена_всего_без_скидки_без_ндс * @ндс_процент) AS цена_всего_без_скидки,
	@цена_всего:= IF(@скидка_процентная <> 0 AND @скидка_процентная <> NULL, @цена_всего_без_скидки * (1 - (@скидка_процентная / 100)), IF(@скидка_денежная <> 0, @цена_всего_без_скидки - (@скидка_денежная), @цена_всего_без_скидки)),
	@цена_всего AS цена_всего,
	@всего_прибыль_без_скидки_без_ндс:= IF(@цена_всего_без_скидки_без_ндс - @всего_закупка = @цена_всего_без_скидки_без_ндс, 0, @цена_всего_без_скидки_без_ндс - @всего_закупка) AS всего_прибыль_без_скидки_без_ндс,
	@всего_прибыль_без_скидки:= IF(@цена_всего_без_скидки - @всего_закупка = @цена_всего_без_скидки, 0, @цена_всего_без_скидки - @всего_закупка) AS всего_прибыль_без_скидки,
	@всего_прибыль:= IF(@цена_всего - @всего_закупка = @цена_всего, 0, @цена_всего - @всего_закупка) AS всего_прибыль,
	@сумма_скидки:= (@цена_всего_без_скидки * (@скидка_процентная / 100)) AS сумма_скидки
FROM
	sales s1



Не правильно выводятся некоторые поля (скидка, цена_всего). Подскажите как подругому сделать этот запрос?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398484
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "неправильно выводятся"? задом наперёд? вверх ногами? обясняйте вменяемо.

PS. Есть тег SRC - покрасивше, чем цитата...
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398492
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Этот запрос выводится в DBGrid после первого запроса в поле "скидка" и в "цена_всего" пишет "(BLOB)". Если еще несколько раз запустить этот запрос (типо обновить) то нормально. Почему не хочет сразу все нормально?
А вообще завпрос нормально оформлен? Может как то можно подругному?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398507
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF(s1.discount_percent <> null, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398513
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я смутно помню, порядок вычисления выражений в секции SELECT не определен, поэтому, имхо, стоит отказаться от использования промежуточных переменных и вычислять нужно значение целиком.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398521
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, поподробней можно, пожалуйста?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398528
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneв поле "скидка"странно, в приведённом запросе нет такого поля
THomZoneи в "цена_всего" пишет "(BLOB)"ну а что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398549
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZonemiksoft, поподробней можно, пожалуйста?
Ну вот, например, есть такие строки в запросе:
Код: sql
1.
2.
3.
@скидка_процентная:= IF(s1.discount_percent <> null, s1.discount_percent, 0) AS скидка_процентная,
...
IF(@скидка_процентная <> 0, @скидка_процентная, IF(@скидка_денежная <> 0, @скидка_денежная, 0)) AS скидка,

Я не уверен, что всегда будет вычисляться сначала первая, потом вторая.
Поэтому эти строки я предлагаю переписать так, чтобы из результат не зависел от порядка вычисления.
Код: sql
1.
2.
3.
IFNULL(s1.discount_percent,0) AS скидка_процентная,
...
IF(IFNULL(s1.discount_percent,0)<>0, IFNULL(s1.discount_percent,0), IFNULL(s1.discount_money,0)) AS скидка


Если s1.discount_percent не бывает равен 0, то выражение можно еще упростить.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398551
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, поле "скидка" объявлено
Код: sql
1.
IF(@скидка_процентная <> 0, @скидка_процентная, IF(@скидка_денежная <> 0, @скидка_денежная, 0)) AS скидка


Внимательно код посмотрите.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398556
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftIF(, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)Да ладно читабельность... а что s1.discount_percent <> null всегда даёт TRUE - это ничего?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398563
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, почему всегда? Это поле в базще может быть NULL
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398570
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinamiksoftIF(, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)Да ладно читабельность... а что s1.discount_percent <> null всегда даёт TRUE - это ничего?Да, каюсь, пропустил :)
Это, конечно, тоже обязательно нужно исправлять. Теперь уже думаю, что это наиболее вероятная причина отклонения логики запроса от желаемой.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398575
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneAkina, почему всегда? Это поле в базще может быть NULLс NULL нельзя сравнивать напрямую операторами отношения. Можно только через IS NULL/IS NOT NULL.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398590
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, с этим просто, а вот что делать с полем "цена_всего"? В нем очень большая формула если убрать переменные. Чем можно заменить меременные?
Я вот до MySQL пользовался MS Access в нем делал так:
Код: sql
1.
2.
3.
4.
5.
...
IIF(s1.discount_percent <> null, s1.discount_percent, 0) AS [скидка процентная],
IIF(s1.discount_money <> null, s1.discount_money, 0) AS [скидка денежная],
IIF([скидка процентная] <> 0, FORMAT([скидка процентная], "#") + "%", IIF([скидка денежная] <> 0, FORMAT([скидка денежная], "#,0.00"), 0)) AS [Скидка],
...
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398597
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneполе "скидка" объявленоточно, проглядел
ну тогда тот же вопрос - что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398601
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftTHomZonemiksoft, поподробней можно, пожалуйста?
Ну вот, например, есть такие строки в запросе:
Код: sql
1.
2.
3.
@скидка_процентная:= IF(s1.discount_percent <> null, s1.discount_percent, 0) AS скидка_процентная,
...
IF(@скидка_процентная <> 0, @скидка_процентная, IF(@скидка_денежная <> 0, @скидка_денежная, 0)) AS скидка,

Я не уверен, что всегда будет вычисляться сначала первая, потом вторая.
Поэтому эти строки я предлагаю переписать так, чтобы из результат не зависел от порядка вычисления.
Код: sql
1.
2.
3.
IFNULL(s1.discount_percent,0) AS скидка_процентная,
...
IF(IFNULL(s1.discount_percent,0)<>0, IFNULL(s1.discount_percent,0), IFNULL(s1.discount_money,0)) AS скидка


Если s1.discount_percent не бывает равен 0, то выражение можно еще упростить.Выделенное красным - всегда NULL ! Соответственно, IF(s1.discount_percent <> null, s1.discount_percent, 0) - всегда 0

Маленькое упрощение:
Код: sql
1.
IFNULL(NULLIF(s1.discount_percent,0),IFNULL(s1.discount_money,0)) AS скидка
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398602
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneа вот что делать с полем "цена_всего"? В нем очень большая формула если убрать переменныену так уберите переменные и напишите большую формулу :)
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398604
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZonemiksoft, с этим просто, а вот что делать с полем "цена_всего"? В нем очень большая формула если убрать переменные. Чем можно заменить меременные?Во-первых, если подбирать для использования наиболее оптимальные функции, то итоговое выражение изрядно сократится. Один из вариантов для этого я уже дал, еще на один намекнул.
Во-вторых, можно этот запрос убрать в подзапрос и вычислять часть полей в подзапросе, а часть во внешнем запросе.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398617
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВо-вторых, можно этот запрос убрать в подзапрос и вычислять часть полей в подзапросе, а часть во внешнем запросе....и здравствуй, материализация. ТС ведь по всей таблице считает (если, конечно, не откусил хвост запроса). Я бы предпочёл написать длинный, но "прямой" запрос.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398632
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirTHomZoneполе "скидка" объявленоточно, проглядел
ну тогда тот же вопрос - что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?

Нормальные цыфровые значения
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398639
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneAkina, почему всегда? Это поле в базще может быть NULL
Потому что сравнение NULL с любым значением (в т.ч. с другим NULL) всегда даёт NULL, если не используется специальное NULL-safe сравнение.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398645
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirmiksoftВо-вторых, можно этот запрос убрать в подзапрос и вычислять часть полей в подзапросе, а часть во внешнем запросе....и здравствуй, материализация. ТС ведь по всей таблице считает (если, конечно, не откусил хвост запроса). Я бы предпочёл написать длинный, но "прямой" запрос.Хм, а почему материализация?
Специально не ловил, но не припомню, чтобы сталкивался с таким.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398655
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно пожалуйста пример переделанного моего запроса. А то у меня уже мозги не варят совсем
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398658
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZone ,

попробуйте выполнить
Код: sql
1.
select null=null, 1=null, 1<>null, null<>null
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398662
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZone,

ну тогда остаётся грешить только на порядок расчёта переменных.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398674
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirTHomZone,

ну тогда остаётся грешить только на порядок расчёта переменных.
А переменные чем то можно заменить? Ну, какой то другой способ
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398677
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftХм, а почему материализация?неверно выразился... при отработке запроса вида
Код: sql
1.
2.
3.
select *,траляля from (
 select *,труляля from table
) t0

как только объём данных, возвращаемых внутренним селектом, перерастёт за... tmp_table_size, вроде?.., так сразу же начнётся работа с диском. А поскольку в табличке скорее всего не десять и не двадцать записей, то ТС на это напорется практически гарантированно - если, повторюсь, он при копировании на форум не убрал из текста запроса имеющийся в нём where.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398698
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneА переменные чем то можно заменить? Ну, какой то другой способФормулой, по которой они рассчитываются из базовых полей. Больше ничем. Ну или как миксофт предложил, с подзапросом(-ами):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t0.*
 ,complexvar1:=if(var1...
 ,complexvar2:=case when var1=var2...
 ...
 ,complexvarN:=somefunction(varN,var1)
from (
 select <...>
  ,var1:=if(field1...
  ,var2:=case when field2...
  ...
  ,varN:=...
 from table
) t0

но это кроме сокращения текста запроса (и то не факт) ничего больше не даст.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398742
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На последнего.

не смотрел весь запрос, но обратил внимание на то, что в секции from нет подзапроса с предустановкой значений переменных. Я конечно понимаю, что они в селекте сразу насчитываются и присваиваются ... наверное, но для себя - давно взял за правило делать джойн с селектом, в котором устанавливаю переменные по дефолту. Хотя бы их тип становится известен ДО начала выполнения.. а то преобразования типов с неустановленной перенной панимаишь ли...
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398753
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109На последнего.

не смотрел весь запрос, но обратил внимание на то, что в секции from нет подзапроса с предустановкой значений переменных. Я конечно понимаю, что они в селекте сразу насчитываются и присваиваются ... наверное, но для себя - давно взял за правило делать джойн с селектом, в котором устанавливаю переменные по дефолту. Хотя бы их тип становится известен ДО начала выполнения.. а то преобразования типов с неустановленной перенной панимаишь ли...
А можете пример дать
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398774
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZone,

Код: sql
1.
SELECT @var := t.`f1`, @var AS var FROM `table` AS t, (SELECT @var:='') AS dummy WHERE t.id IN(1,2,3);  



Здесь алиас dummy как раз и есть подзапрос по предустановке значения переменной. Сталкивался с похожим поведением, но не помню ситуации конкретно. После этого всегда делаю такой dummy если используются переменные в запросе.
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38398810
THomZone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109THomZone,

Код: sql
1.
SELECT @var := t.`f1`, @var AS var FROM `table` AS t, (SELECT @var:='') AS dummy WHERE t.id IN(1,2,3);  



Здесь алиас dummy как раз и есть подзапрос по предустановке значения переменной. Сталкивался с похожим поведением, но не помню ситуации конкретно. После этого всегда делаю такой dummy если используются переменные в запросе.

Спасибо, помогло!
...
Рейтинг: 0 / 0
Помогите правильно оформить запрос?
    #38399296
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
THomZoneAkina, Этот запрос выводится в DBGrid после первого запроса в поле "скидка" и в "цена_всего" пишет "(BLOB)". Если еще несколько раз запустить этот запрос (типо обновить) то нормально. Почему не хочет сразу все нормально?
А вообще завпрос нормально оформлен? Может как то можно подругному?

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


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