powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите правильно оформить запрос?
25 сообщений из 33, страница 1 из 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
25 сообщений из 33, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите правильно оформить запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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