Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
07.03.2002, 12:46
|
|||
|---|---|---|---|
|
|||
Вопрос от чайника с носиком:) |
|||
|
#18+
Я только начинаю работать с 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е делать выборку данных и заодно присваивать значения переменным? Заранее благодарен за помощь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.03.2002, 13:56
|
|||
|---|---|---|---|
|
|||
Вопрос от чайника с носиком:) |
|||
|
#18+
Я думаю, тебе навряд ли кто нить ответить, потому как вопрос несколько не по адресу, все твои вопросы с лёгкостью решаються, стоит только начитаться документации. Ну а по поводу, где и как считать, так у тебя же не 1000000 человек работает. А вообче по уму лучше все часто используемые функции и процедурки хранить на сервере. Даже с точки зрения ленивого человека, лучше менять в одном месте, чем париться на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.03.2002, 13:59
|
|||
|---|---|---|---|
|
|||
Вопрос от чайника с носиком:) |
|||
|
#18+
Я думаю, тебе навряд ли кто нить ответить, потому как вопрос несколько не по адресу, все твои вопросы с лёгкостью решаються, стоит только начитаться документации. Ну а по поводу, где и как считать, так у тебя же не 1000000 человек работает. А вообче по уму лучше все часто используемые функции и процедурки хранить на сервере. Даже с точки зрения ленивого человека, лучше менять в одном месте, чем париться на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.03.2002, 14:06
|
|||
|---|---|---|---|
Вопрос от чайника с носиком:) |
|||
|
#18+
Можно засунуть вызов Max в подзапрос, а можно еще короче: SELECT top 1 @ActSal=Оклад FROM Оклад WHERE Дата <= @CurDate AND IDРаботника=@IDWorker order by Дата desc На самом деле, SQLServer использует top 1, даже если используется Max в подзапросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.03.2002, 20:27
|
|||
|---|---|---|---|
Вопрос от чайника с носиком:) |
|||
|
#18+
2 основных момента: 1. БД должна быть красивой, то есть нормализованной 2. Теоретически у сотрудника оклад в течении одного месяца может поменятся несколько раз. Вариантов не остается - однозначно делать таблицу и в ней хранить по датам и суммам. Запросы писать научитесь - просто надо стараться мысленно разбивать задачу на множество вопросов "что надо", а потом думать "как сделать". Далее все это обьединять в один запрос, используя вложенные запросы и вьюверы. Функцию сразу рекомендую переделать так, чтобы она возвращала на указанную дату таблицу, содержащую текущие оклады всех сотрудников, потому как от Вашего варианта мало толку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.03.2002, 07:17
|
|||
|---|---|---|---|
Вопрос от чайника с носиком:) |
|||
|
#18+
На самом деле можно обойтись без MAX, если добавить еще одно поле - дату следующего изменения, для последней записи она должна быть заведомо большая. Тогда запрос несколько упрощается SELECT @ActSal=Оклад FROM Оклад WHERE Дата<=@CurDate and СледующаяДата>@CurDate AND IDРаботника=@IDWorker ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.03.2002, 06:07
|
|||
|---|---|---|---|
|
|||
Вопрос от чайника с носиком:) |
|||
|
#18+
TO ASCRUS 2 основных момента: 1. БД должна быть красивой, то есть нормализованной Нормализованная она 2. Теоретически у сотрудника оклад в течении одного месяца может поменятся несколько раз. Совершенно точно не может! Вариантов не остается - однозначно делать таблицу и в ней хранить по датам и суммам. Запросы писать научитесь - просто надо стараться мысленно разбивать задачу на множество вопросов "что надо", а потом думать "как сделать". Далее все это обьединять в один запрос, используя вложенные запросы и вьюверы. Ну так я и учусь.. Функцию сразу рекомендую переделать так, чтобы она возвращала на указанную дату таблицу, содержащую текущие оклады всех сотрудников, потому как от Вашего варианта мало толку. А если необходимо за три месяца? To All Всем спасибо за ответы, будем пробовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&tablet=1&tid=1823467]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 408ms |

| 0 / 0 |
