Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос от чайника с носиком:) / 7 сообщений из 7, страница 1 из 1
07.03.2002, 12:46
    #32024702
Илья
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
Я только начинаю работать с MSSQL, поэтому неизбежно возникают вопросы, просьба сильно не пинать, если они окажутся глупыми

Я проектирую базу содержащую сведения о сотрудниках предприятия, одним из параметров является оклад, который меняется достаточно редко, но все изменения необходимо хранить. Вопрос в следующем: что лучше - хранить оклад для каждого работника по месяцам (т.е. данные в большинстве случаев будут дублироваться) или же все-таки сохранять сумму и дату изменения. Объем данных в этом случае уменьшится, но в таком случае как лучше выбирать значение оклада на определенную дату? В настоящее время я написал вот такую юзеровскую функцию, которая возвращает значение оклада:

CREATE FUNCTION GetSalary
(@CurDate smalldatetime,
@IDWorker smallint)
RETURNS smallmoney
AS
BEGIN
DECLARE @ActDate smalldatetime, @ActSal smallmoney
SELECT @ActDate = Max(Дата) FROM Оклад WHERE Дата <= @CurDate AND IDРаботника=@IDWorker
SELECT @ActSal=Оклад FROM Оклад WHERE Дата=@ActDate AND IDРаботника=@IDWorker
RETURN @ActSal
END

Это не слишком криво? Умнее я ничего пока не придумал...

Второй вопрос (вернее группа вопросов):
Стоит ли доверить все вычисления клиенту или же лучше производить их на сервере прямо при выборке? Можно-ли в SELECTе делать выборку данных и заодно присваивать значения переменным?

Заранее благодарен за помощь...
...
Рейтинг: 0 / 0
07.03.2002, 13:56
    #32024721
Сорри
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
Я думаю, тебе навряд ли кто нить ответить, потому как вопрос несколько не по адресу, все твои вопросы с лёгкостью решаються, стоит только начитаться документации. Ну а по поводу, где и как считать, так у тебя же не 1000000 человек работает. А вообче по уму лучше все часто используемые функции и процедурки хранить на сервере. Даже с точки зрения ленивого человека, лучше менять в одном месте, чем париться на клиенте.
...
Рейтинг: 0 / 0
07.03.2002, 13:59
    #32024723
Сорри
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
Я думаю, тебе навряд ли кто нить ответить, потому как вопрос несколько не по адресу, все твои вопросы с лёгкостью решаються, стоит только начитаться документации. Ну а по поводу, где и как считать, так у тебя же не 1000000 человек работает. А вообче по уму лучше все часто используемые функции и процедурки хранить на сервере. Даже с точки зрения ленивого человека, лучше менять в одном месте, чем париться на клиенте.
...
Рейтинг: 0 / 0
07.03.2002, 14:06
    #32024726
AlexP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
Можно засунуть вызов Max в подзапрос, а можно еще короче:
SELECT top 1 @ActSal=Оклад FROM Оклад WHERE Дата <= @CurDate AND IDРаботника=@IDWorker order by Дата desc

На самом деле, SQLServer использует top 1, даже если используется Max в подзапросе.
...
Рейтинг: 0 / 0
09.03.2002, 20:27
    #32024799
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
2 основных момента:
1. БД должна быть красивой, то есть нормализованной
2. Теоретически у сотрудника оклад в течении одного месяца может поменятся несколько раз.
Вариантов не остается - однозначно делать таблицу и в ней хранить по датам и суммам.

Запросы писать научитесь - просто надо стараться мысленно разбивать задачу на множество вопросов "что надо", а потом думать "как сделать". Далее все это обьединять в один запрос, используя вложенные запросы и вьюверы.

Функцию сразу рекомендую переделать так, чтобы она возвращала на указанную дату таблицу, содержащую текущие оклады всех сотрудников, потому как от Вашего варианта мало толку.
...
Рейтинг: 0 / 0
11.03.2002, 07:17
    #32024813
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
На самом деле можно обойтись без MAX, если добавить еще одно поле - дату следующего изменения, для последней записи она должна быть заведомо большая.
Тогда запрос несколько упрощается

SELECT @ActSal=Оклад FROM Оклад WHERE Дата<=@CurDate and СледующаяДата>@CurDate AND IDРаботника=@IDWorker
...
Рейтинг: 0 / 0
20.03.2002, 06:07
    #32025755
Random
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос от чайника с носиком:)
TO ASCRUS

2 основных момента:
1. БД должна быть красивой, то есть нормализованной


Нормализованная она

2. Теоретически у сотрудника оклад в течении одного месяца может поменятся несколько раз.

Совершенно точно не может!

Вариантов не остается - однозначно делать таблицу и в ней хранить по датам и суммам.
Запросы писать научитесь - просто надо стараться мысленно разбивать задачу на множество вопросов "что надо", а потом думать "как сделать". Далее все это обьединять в один запрос, используя вложенные запросы и вьюверы.


Ну так я и учусь..

Функцию сразу рекомендую переделать так, чтобы она возвращала на указанную дату таблицу, содержащую текущие оклады всех сотрудников, потому как от Вашего варианта мало толку.

А если необходимо за три месяца?

To All

Всем спасибо за ответы, будем пробовать...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос от чайника с носиком:) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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