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

Откуда:
Сообщений: 4
Всем привет! помогите пожалуйста решить мою проблему. Пытаюсь написать запрос, который подсчитывает количество баллов и переводит их в процент надбавки по определенным формулам. Начал писать запрос с использованием конструкции case when но столкнулся с ограничением в не более 10 уровней вложенности. Подскажите как мне это побороть... буду очень благодарен за помощь.
 select 
 dbo.Spr_performance_indicator.Name,
 '',
 dbo.Sys_User.Name,
 
--Блок подсчета баллов и процентов за работу

--Формула первая
--Первый вид работы
 case when dbo.Spr_performance_indicator.Ouid_Parent IN (1) then 
 case when
 Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 1 and 7 then 0.1
 when 
 Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 8 and 14 then 0.2
 else 9999
 end
 else 
 --Второй вид работы
 case when dbo.Spr_performance_indicator.Ouid_Parent IN (2) then 
 case when
 Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 1 and 3 then 0.1
 when
 Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 4 and 6 then 0.2
 else 9999
 end
 else 
 --третй вид работы
 --Четвертый вид работы
 --Пятый вид работы
 --шестой вид работы
 --Седьмой вид работы
 --восьмой вид работы
 --девятый вид работы
 --десятый вид работы
 --одинадцатый вид работы
 --двенадцатый вид работы
 end
  end
   end
from dbo.Intensity_index
inner join dbo.Sys_User on dbo.Sys_User.Ouid=dbo.Intensity_index.CreateUserID 
inner join dbo.Spr_performance_indicator on dbo.Spr_performance_indicator.Ouid=dbo.Intensity_index.Ouid_Perf 
order by dbo.Sys_User.Name
8 окт 11, 19:18    [11407384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
iljy
Member

Откуда:
Сообщений: 8711
AlexDron,

ничего не понятно, но так, навскидку - в case может быть произвольное количество предложений when, соответственно ваше условие можно записать в один уровень.

+ Вкладываем, и вкладываем...
declare @c char set @c = 'c'
select
	case @c
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
		when 'a' then 1
		when 'b' then 2
		when 'c' then 3
		when 'd' then 4
		when 'e' then 5
		when 'f' then 6
		when 'g' then 7
		when 'h' then 8
		when 'i' then 9
		when 'j' then 10
		when 'k' then 11
		when 'l' then 12
	end		
8 окт 11, 19:25    [11407404]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
ё
Guest
AlexDron,

внешний case сделайте так же как сделали во внутренем
case 
	when dbo.Spr_performance_indicator.Ouid_Parent IN (1) then 
 		case
			when Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 1 and 7 then 0.1
			when Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 8 and 14 then 0.2
			else 9999
		end
	when dbo.Spr_performance_indicator.Ouid_Parent IN (2) then 
 		case 
			when Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 1 and 3 then 0.1
			when Convert (numeric(19,0), SUM(convert(money,dbo.Intensity_index.Perf_Kol))*66/convert(money,dbo.Sys_User.Kol_Rab_Days )) between 4 and 6 then 0.2
			else 9999
		 end
	....
а по уму - тут табличка ещё одна нужна с {Ouid_Parent, min, max, value}

зы
и это что за хрень
when dbo.Spr_performance_indicator.Ouid_Parent IN (2)
почему не просто = ?
8 окт 11, 19:32    [11407416]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
AlexDron
Member

Откуда:
Сообщений: 4
Попытаюсь развернуто написать что нужно. Есть таблица dbo.Spr_performance_indicator в столбец Ouid_Parent записывается вид работы (записывается ouid из справочника вида работ dbo.Spr_performance_indicator). У каждого вида работы есть свой диапазон показателя за который присваивается оценка показателя в баллах (некий процент надбавки). Т.е. допустим есть вид работы (1) у него есть свои значения показателя и своя оценка показателя в баллах и так у каждого вида работы (всего 13 видов работы). например если работник выполнил за определенный период времени работу (1) в значении показателя в диапазоне от 1-7 то ему присваивается 0,1 балл если он эту же работу выполнил в диапазоне от 8-14 то он получит 0,2 балла и так далее для каждого вида работы...
8 окт 11, 19:42    [11407435]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
iljy
Member

Откуда:
Сообщений: 8711
AlexDron,

вообще говоря такие вещи проще загнать в таблицу и потом с ней делать join. Будет чуть медленнее, но гораздо читабельнее.
8 окт 11, 19:43    [11407440]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
AlexDron
Member

Откуда:
Сообщений: 4
зы
и это что за хрень
when dbo.Spr_performance_indicator.Ouid_Parent IN (2)
почему не просто = ?
Можно и приравнять.. просто есть несколько видов работ, которые рассчитываются одинаково вот и написал IN...
8 окт 11, 19:45    [11407443]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
ё
Guest
AlexDron
Попытаюсь развернуто написать что нужно. Есть таблица dbo.Spr_performance_indicator в столбец Ouid_Parent записывается вид работы (записывается ouid из справочника вида работ dbo.Spr_performance_indicator). У каждого вида работы есть свой диапазон показателя за который присваивается оценка показателя в баллах (некий процент надбавки). Т.е. допустим есть вид работы (1) у него есть свои значения показателя и своя оценка показателя в баллах и так у каждого вида работы (всего 13 видов работы). например если работник выполнил за определенный период времени работу (1) в значении показателя в диапазоне от 1-7 то ему присваивается 0,1 балл если он эту же работу выполнил в диапазоне от 8-14 то он получит 0,2 балла и так далее для каждого вида работы...


"не сорите словами" (с) кино какоито

Рекомендации по оформлению сообщений в форуме
п.6
8 окт 11, 19:45    [11407444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с ограничением case  [new]
AlexDron
Member

Откуда:
Сообщений: 4
Уважаемый ё Вы мне помогли советом (внешний case сделайте так же как сделали во внутренем) большое спасибо!! Пока все работает.
8 окт 11, 20:43    [11407571]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить