Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите правильно оформить запрос? / 25 сообщений из 33, страница 1 из 2
17.09.2013, 11:07:47
    #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
17.09.2013, 11:13:15
    #38398484
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
Что значит "неправильно выводятся"? задом наперёд? вверх ногами? обясняйте вменяемо.

PS. Есть тег SRC - покрасивше, чем цитата...
...
Рейтинг: 0 / 0
17.09.2013, 11:17:35
    #38398492
THomZone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
Akina, Этот запрос выводится в DBGrid после первого запроса в поле "скидка" и в "цена_всего" пишет "(BLOB)". Если еще несколько раз запустить этот запрос (типо обновить) то нормально. Почему не хочет сразу все нормально?
А вообще завпрос нормально оформлен? Может как то можно подругному?
...
Рейтинг: 0 / 0
17.09.2013, 11:28:35
    #38398507
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
IF(s1.discount_percent <> null, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)
...
Рейтинг: 0 / 0
17.09.2013, 11:30:33
    #38398513
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
Насколько я смутно помню, порядок вычисления выражений в секции SELECT не определен, поэтому, имхо, стоит отказаться от использования промежуточных переменных и вычислять нужно значение целиком.
...
Рейтинг: 0 / 0
17.09.2013, 11:35:12
    #38398521
THomZone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
miksoft, поподробней можно, пожалуйста?
...
Рейтинг: 0 / 0
17.09.2013, 11:39:16
    #38398528
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
THomZoneв поле "скидка"странно, в приведённом запросе нет такого поля
THomZoneи в "цена_всего" пишет "(BLOB)"ну а что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?
...
Рейтинг: 0 / 0
17.09.2013, 11:46:06
    #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
17.09.2013, 11:46:21
    #38398551
THomZone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
tanglir, поле "скидка" объявлено
Код: sql
1.
IF(@скидка_процентная <> 0, @скидка_процентная, IF(@скидка_денежная <> 0, @скидка_денежная, 0)) AS скидка


Внимательно код посмотрите.
...
Рейтинг: 0 / 0
17.09.2013, 11:48:06
    #38398556
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
miksoftIF(, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)Да ладно читабельность... а что s1.discount_percent <> null всегда даёт TRUE - это ничего?
...
Рейтинг: 0 / 0
17.09.2013, 11:49:41
    #38398563
THomZone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
Akina, почему всегда? Это поле в базще может быть NULL
...
Рейтинг: 0 / 0
17.09.2013, 11:51:49
    #38398570
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
AkinamiksoftIF(, s1.discount_percent, 0) для читабельности лучше заменить на IFNULL(s1.discount_percent, 0)Да ладно читабельность... а что s1.discount_percent <> null всегда даёт TRUE - это ничего?Да, каюсь, пропустил :)
Это, конечно, тоже обязательно нужно исправлять. Теперь уже думаю, что это наиболее вероятная причина отклонения логики запроса от желаемой.
...
Рейтинг: 0 / 0
17.09.2013, 11:53:09
    #38398575
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
THomZoneAkina, почему всегда? Это поле в базще может быть NULLс NULL нельзя сравнивать напрямую операторами отношения. Можно только через IS NULL/IS NOT NULL.
...
Рейтинг: 0 / 0
17.09.2013, 11:56:54
    #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
17.09.2013, 11:59:49
    #38398597
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
THomZoneполе "скидка" объявленоточно, проглядел
ну тогда тот же вопрос - что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?
...
Рейтинг: 0 / 0
17.09.2013, 12:00:40
    #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
17.09.2013, 12:00:49
    #38398602
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
THomZoneа вот что делать с полем "цена_всего"? В нем очень большая формула если убрать переменныену так уберите переменные и напишите большую формулу :)
...
Рейтинг: 0 / 0
17.09.2013, 12:01:10
    #38398604
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
THomZonemiksoft, с этим просто, а вот что делать с полем "цена_всего"? В нем очень большая формула если убрать переменные. Чем можно заменить меременные?Во-первых, если подбирать для использования наиболее оптимальные функции, то итоговое выражение изрядно сократится. Один из вариантов для этого я уже дал, еще на один намекнул.
Во-вторых, можно этот запрос убрать в подзапрос и вычислять часть полей в подзапросе, а часть во внешнем запросе.
...
Рейтинг: 0 / 0
17.09.2013, 12:04:54
    #38398617
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
miksoftВо-вторых, можно этот запрос убрать в подзапрос и вычислять часть полей в подзапросе, а часть во внешнем запросе....и здравствуй, материализация. ТС ведь по всей таблице считает (если, конечно, не откусил хвост запроса). Я бы предпочёл написать длинный, но "прямой" запрос.
...
Рейтинг: 0 / 0
17.09.2013, 12:09:09
    #38398632
THomZone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите правильно оформить запрос?
tanglirTHomZoneполе "скидка" объявленоточно, проглядел
ну тогда тот же вопрос - что у вас лежит в переменных
"скидка_процентная","цена_всего_без_скидки","скидка_денежная" сразу после первого запроса?

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

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

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


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