Помощь с UPDATE

Георгий Ушаков
Дата: 06.02.2013 07:16:03
Есть вот такая вот куча 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, да и работает достаточно медленно, хотелось бы сделать приличнее
Добрый Э - Эх
Дата: 06.02.2013 07:22:38
один 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
Георгий Ушаков
Дата: 06.02.2013 07:40:42
Добрый Э - Эх, там во многих случаях один CASE зависит от предыдущего. Вообще, таблица формируется накопительно, по нескольким условиям. Ваш пример так не делает.
Добрый Э - Эх
Дата: 06.02.2013 07:55:18
Георгий Ушаков,

никто тебе не мешает делать "накопительный" case. и, если что, case неплохо себе поддерживает вложенность во всех своих ветках (в then, в else, в when) для таких целей:
case 
  when case ... end ... then ...
  when ... then case ... end
else case when ... then ...
   
Добрый Э - Эх
Дата: 06.02.2013 08:14:18
ну и это... когда будешь чего-то реализовывать, то про остаток от деления почитай... Оно как раз тебе подойдет для расчета скидки...
aleks2
Дата: 06.02.2013 08:51:34
Добрый Э - Эх
Георгий Ушаков,

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


Вот нафега? Пущай лучше комменты напишет.
Больше толку будет.
Георгий Ушаков
Дата: 06.02.2013 09:43:45
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
Гость333
Дата: 06.02.2013 10:08:17
Георгий Ушаков
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".

Ну и само собой, напрашивается таблица скидок. Тогда при изменении условий скидок, вместо переписывания кода, нужно будет всего лишь поменять данные в этой таблице.
Cygapb-007
Дата: 06.02.2013 10:14:19
Сходу хотел предложить вариант с СТЕ :)
;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 
Добрый Э - Эх
Дата: 06.02.2013 10:51:46
Георгий Ушаков,

а говорил : "case не канает"... ;)