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

start [/forum/topic.php?fid=46&tid=1823467]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 341ms |

| 0 / 0 |
