Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь с UPDATE  [new]
Георгий Ушаков
Member

Откуда:
Сообщений: 13
Есть вот такая вот куча UPDATE'ов.
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1 WHERE temporadb.dbo.x_skid.sum_nakl > 500*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')AND temporadb.dbo.x_skid.sum_nakl < 1000*35
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1 
WHERE temporadb.dbo.x_skid.sum_nakl > 1000*35
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1
 WHERE temporadb.dbo.x_skid.sum_nakl > 1000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1 
WHERE temporadb.dbo.x_skid.sum_nakl > 2000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1
WHERE temporadb.dbo.x_skid.sum_nakl > 3000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1
WHERE temporadb.dbo.x_skid.sum_nakl > 5000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1
WHERE temporadb.dbo.x_skid.sum_nakl > 7000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')
UPDATE temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + 1
WHERE temporadb.dbo.x_skid.sum_nakl > 10000*35 AND (temporadb.dbo.x_skid.Net_Type LIKE '%СЕТИ%' OR temporadb.dbo.x_skid.Net_Type LIKE '%МАГАЗИНЫ%')


Можно ли ее как-то привести в божеский вид, или придется так и оставить? Я предполагаю, что сделать что-то можно, уж слишком это похоже на костыль, UPDATE'ов будет за 200, да и работает достаточно медленно, хотелось бы сделать приличнее
6 фев 13, 07:16    [13881600]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Добрый Э - Эх
Guest
один update, с case-ом для формирования правильного нового значения:
update temporadb.dbo.x_skid 
   set temporadb.dbo.x_skid.skid = case when temporadb.dbo.x_skid.sum_nakl > 1000*35 then ... 
                                        when                 ...                     then ... 
                                   end
6 фев 13, 07:22    [13881603]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Георгий Ушаков
Member

Откуда:
Сообщений: 13
Добрый Э - Эх, там во многих случаях один CASE зависит от предыдущего. Вообще, таблица формируется накопительно, по нескольким условиям. Ваш пример так не делает.
6 фев 13, 07:40    [13881613]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Добрый Э - Эх
Guest
Георгий Ушаков,

никто тебе не мешает делать "накопительный" case. и, если что, case неплохо себе поддерживает вложенность во всех своих ветках (в then, в else, в when) для таких целей:
case 
  when case ... end ... then ...
  when ... then case ... end
else case when ... then ...
   
6 фев 13, 07:55    [13881630]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Добрый Э - Эх
Guest
ну и это... когда будешь чего-то реализовывать, то про остаток от деления почитай... Оно как раз тебе подойдет для расчета скидки...
6 фев 13, 08:14    [13881654]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
aleks2
Guest
Добрый Э - Эх
Георгий Ушаков,

никто тебе не мешает делать "накопительный" case. и, если что, case неплохо себе поддерживает вложенность во всех своих ветках (в then, в else, в when) для таких целей:
case 
  when case ... end ... then ...
  when ... then case ... end
else case when ... then ...
   


Вот нафега? Пущай лучше комменты напишет.
Больше толку будет.
6 фев 13, 08:51    [13881732]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Георгий Ушаков
Member

Откуда:
Сообщений: 13
UPDATE temporadb.dbo.x_skid  SET temporadb.dbo.x_skid.skid = 
                                            case WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 35000 and 70000 then
                                                                    temporadb.dbo.x_skid.skid + 2
                                                                        WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 70000 and 105000 then
                                                                    temporadb.dbo.x_skid.skid + 3 
                                                                        WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 70000 and 105000 then
                                                                    temporadb.dbo.x_skid.skid + 4 end
                                               WHERE temporadb.dbo.x_skid.Net_Type LIKE '%B2B%'


Результат

Name Net Manager Net_Type Curr_Skid Sum_nakl kol_art loyality skid
"Альянс-Стройиндустрия" ООО "Альянс-Стройиндустрия"ООО Хан! B2B 2.00 81758 37 NULL NULL
6 фев 13, 09:43    [13881963]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Георгий Ушаков
UPDATE temporadb.dbo.x_skid  SET temporadb.dbo.x_skid.skid = 
                                            case WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 35000 and 70000 then
                                                                    temporadb.dbo.x_skid.skid + 2
                                                                        WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 70000 and 105000 then
                                                                    temporadb.dbo.x_skid.skid + 3 
                                                                        WHEN temporadb.dbo.x_skid.sum_nakl BETWEEN 70000 and 105000 then
                                                                    temporadb.dbo.x_skid.skid + 4 end
                                               WHERE temporadb.dbo.x_skid.Net_Type LIKE '%B2B%'


Результат

Name Net Manager Net_Type Curr_Skid Sum_nakl kol_art loyality skid
"Альянс-Стройиндустрия" ООО "Альянс-Стройиндустрия"ООО Хан! B2B 2.00 81758 37 NULL NULL

Для начала уберите имя базы, схемы и таблицы из имени столбца:
UPDATE temporadb.dbo.x_skid 
SET skid = CASE
               WHEN sum_nakl BETWEEN 35000 and 70000
               THEN skid + 2
               WHEN sum_nakl BETWEEN 70000 and 105000
               THEN skid + 3 
               WHEN sum_nakl BETWEEN 70000 and 105000
               THEN skid + 4
           END
WHERE Net_Type LIKE '%B2B%'

Код стал гораздо чище и читабельнее. Сразу видно, что условие "BETWEEN 70000 and 105000" повторяется два раза.

В первом посте у вас были строгие неравенства. Исходя из этого, вам нужно писать не "sum_nakl BETWEEN 35000 and 70000", а "35000 < sum_nakl and sum_nakl <= 70000".

Ну и само собой, напрашивается таблица скидок. Тогда при изменении условий скидок, вместо переписывания кода, нужно будет всего лишь поменять данные в этой таблице.
6 фев 13, 10:08    [13882133]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Сходу хотел предложить вариант с СТЕ :)
;with categ as (select * from(values
	(2000,1),(3000,2),(5000,3),(7000,4),(10000,5)
	)tmp(sum_min,skid))
update  temporadb.dbo.x_skid set temporadb.dbo.x_skid.skid 
	+ (SELECT isnull(max(c.skid),0) add_skid FROM categ c where c.sum_min*35 <= temporadb.dbo.x_skid.sum_nakl)
Но с CASE конечно быстрее...
UPDATE temporadb.dbo.x_skid  SET 
	temporadb.dbo.x_skid.skid = temporadb.dbo.x_skid.skid + CASE 
	WHEN temporadb.dbo.x_skid.sum_nakl < 1000*35 THEN 1
	WHEN temporadb.dbo.x_skid.sum_nakl <  70000 THEN 2
	WHEN temporadb.dbo.x_skid.sum_nakl < 105000 THEN 3
	WHEN temporadb.dbo.x_skid.sum_nakl < 350000 THEN 4
	ELSE 5 END
WHERE temporadb.dbo.x_skid.Net_Type LIKE '%B2B%'
	AND temporadb.dbo.x_skid.sum_nakl > 500*35 
6 фев 13, 10:14    [13882176]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с UPDATE  [new]
Добрый Э - Эх
Guest
Георгий Ушаков,

а говорил : "case не канает"... ;)
6 фев 13, 10:51    [13882412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить