LINUX.ORG.RU

sql запрос

 


0

1

Помогите пожалуйста написать запрос:
Есть четыре таблицы:

balance
--bs_id
--bs_name
--bs_date
--bs_value
--bs_direction

workers:
....
--user_start_date
--user_post

factors_exp
--exp_id
--exp_year
--exp_factor

post:
--post_id
--post_name
--post_pay
суть в том, что в таблице у рабочих есть пометка, когда они начали работать и занимаемая ими должность.

В таблице post ставяться в соответствие должности и зарплаты на эти должности.
В таблице factors_exp ставяться в соответсие значения срока работы и коэффициента повышения зарплаты, выглядит так:

years  factor
1         1.1
5         1.3
10        1.5
и т.д.

Суть в том, что в таблицу balance нужно записать сколько каждому работнику была начислена зарплата (вычисляется как заработная плата должности сотрудника умноженная на коэффициент заработка).

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

★★★

Ответ на: комментарий от anonymous_sapiens

В этой таблице хранятся не только значения о зарплатах, в ней так же храниться информация о налогах, дополнительных расходах и тд

disee ★★★
() автор топика

balance.bs_name ??? УБЕВАТЬ!!!

factors_exp
--exp_id
--exp_year
--exp_factor

УБЕВАТЬ ЖЕСТОКО!!! Если у сущности есть диапазон [0-1),[1-5),[5-10), то в таблице должны быть ОБЕ ГРАНИЦЫ ДИАПАЗОНА. Без наличия в диапазоне обеих границ задачу (и разработчика) можно списывать в утиль как непригодные.

Затем - все журнальные данные для расчета должны вестись в историческом разрезе (или необходимо вести полную историю данных для расчета)

no-dashi ★★★★★
()

Что-то я не усмотрел связи между таблицей balance и другими таблицами. По какому ключу предлагаете записывать туда значения и по какому ключу потом связывать записи в balance с реальными людьми?

delete83 ★★
()

Если задача единоразовая, сделай циклом через ЯП, чо там.

moscwich
()

Если я правильно понял проблему, то

post_pay*(select fe.exp_factor from factors_exp fe where fe.exp_year between (select max(fe2.exp_year) from factors_exp fe2 where fe2.exp_year < fe.year) and (select min(fe2.exp_year) from factors_exp fe2 where fe2.exp_year > fe.year))
с поправкой на ваш диалект sql.

winlook38 ★★
()
Ответ на: комментарий от no-dashi

По поводу диапазонов сейчас исправлю.

Затем - все журнальные данные для расчета должны вестись в историческом разрезе (или необходимо вести полную историю данных для расчета)

Не совсем понимаю о чем вы. Не могли бы вы поподробнее объяснить

disee ★★★
() автор топика
Ответ на: комментарий от no-dashi

Короче надо было уже быстро решать поставленную задачу и решение пока что нашлось в таком виде: 1) сделать бездиапазоновую сущность 2) sql запрос:

INSERT INTO balance ( bs_value, bs_name, bs_date, bs_direction )
SELECT [post_pay]*nz([factors_exp].[exp_factor]) AS РазмерЗП, "Зарплата "+[T1].[user_aname]+" "+[T1].[user_bname] AS bs_name, Now() AS bs_date, "-" AS bs_direction
FROM (SELECT (year(date())-year(user_start_date)) AS YearAllWork, * FROM workers INNER JOIN post ON workers.user_post=post.post_id)  AS T1 INNER JOIN factors_exp ON T1.YearAllWork = factors_exp.exp_years;

disee ★★★
() автор топика
Ответ на: комментарий от disee

Правильно будет высчитывать выслугу в днях, а потом уже считать года. Формулу, думаю, сам подберешь. А то у вас получается тот, кто устроился на работу 31 декабря, уже 11 января должен получать надбавку за выслугу в 1 год.

delete83 ★★
()
Ответ на: комментарий от mopsene

А вдруг налоги плавающие изо дня в день? )
Тогда хранить ставку налога по дням и каждый раз пересчитывать будет гораздо накладней)

spdooh
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.