Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 23:12   #1
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
Вопрос ms_sql_server условие

SQL
MS SQL Server 2005

Имеется верхняя и нижняя зарплата работы, имеется дата устройства на работу сотрудника.
Нужно вычислить, сколько платят каждый месяц каждому сотруднику. Если сотрудник работает до года, то платят нижнюю зарплату, если от года до 5 лет, то среднюю ((верх-нижн)/2) и если больше 5 лет, то верхнюю платят.

Вот проблема в том, как условие написать: какая зарплата если столько-то работает сотрудник. Читал про if, но не могу с ним никак разобраться.
Помогите пожалуйста.
Спасибо.
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.
xDyPx вне форума Ответить с цитированием
Старый 26.05.2010, 23:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Нужно вычислить, сколько платят каждый месяц каждому сотруднику.
Что значит - "каждый месяц" ? Этого года, следующего? за один месяц, за два, за 12 ?...

а вообще, в запросе получайте количество полных отработанных лет на момент начисления зарплаты
(например, так:
Код:
select year(@d2)-year(@d1)
	- case when datepart(dy,@d2)>=datepart(dy,@d1) then 0 else 1 end as FullStage
и какую границу брать через case легко разрулить...
примерно так:
Код:
select  
  FIO,
  case when FullStage < 1 then LowZ
    else  case when FullStage < 5 then (HighZ - LowZ)/2
                    else HighZ end
    end as SotrZarplata
from (select SOTR.*,
            year(@d2)-year(@d1)
	   - case 
                    when datepart(dy,@d2)>=datepart(dy,@d1) then 0 else 1 
                   end as FullStage from SOTR) SubSotr
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2010, 00:46   #3
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

Serge_Bliznykov, ОГРОМНОЕ спасибо!!!
правда я взял не Ваш код, но он мне послужил очень хорошим примером.
Спасибо!
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.
xDyPx вне форума Ответить с цитированием
Старый 27.05.2010, 09:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

xDyPx, не за что! Welcome!


p.s. обнаружил неточность в приведённом выше моём примере.
Цитата:
если от года до 5 лет, то среднюю ((верх-нижн)/2)
скорее всего, 5 лет ВКЛЮЧИТЕЛЬНО, т.к. следующее условие идёт "если больше 5 лет".
поэтому надо так:
Код:
...
    else  case when FullStage <= 5 then (HighZ - LowZ)/2
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.05.2010, 13:32   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

это замечание к ТС и написанию условия задачи:
и еще одна неточность заключается в том что вместо минуса там по идее д.б. плюс
Код:
    else  case when FullStage <= 5 then (HighZ + LowZ)/2
soleil@mmc вне форума Ответить с цитированием
Старый 27.05.2010, 14:53   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от soleil@mmc
Код:
else  case when FullStage <= 5 then (HighZ + LowZ)/2
Ну разумеется! Спасибо, коллега!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
условие Maka111 Microsoft Office Excel 5 17.05.2009 18:25
условие Neymexa Общие вопросы .NET 3 19.04.2009 15:39
условие Neymexa Общие вопросы по Java, Java SE, Kotlin 2 07.02.2009 11:37
Условие(If then) Andreyka Общие вопросы Delphi 3 12.01.2009 15:30
Условие [Smarik] Паскаль, Turbo Pascal, PascalABC.NET 3 03.02.2008 08:08