Нужна помощь с запросом SQL - PullRequest
0 голосов
/ 19 ноября 2010

Вот таблицы, которые у меня есть:

employee
 -id
project
 -id
 -employee_id
role
 -id
 -project_id
 -start_date
 -end_date
role_skill
 -id
 -role_id
 -skill_id

skill
 -id
 -name

Таким образом, у сотрудника есть много проектов, у проекта есть много ролей, у роли есть много ролей, а у роли есть навык

* 1005пытается запросить «Навык 1 с опытом работы не менее 10 лет и Навык 2 с опытом работы не менее 3 лет»

В тех случаях, когда опыт работы у сотрудника зависит от той роли, в которой сотрудникнавык в списке.

Запрос на поиск сотрудника, обладающего определенным навыком, не представляет проблемы, но как мне «оглянуться назад», когда я узнаю, что у него есть навык для подсчета количества лет опыта?

Спасибо!

Вот пример процедуры store, в которой есть текущий код:

PROCEDURE [dbo].[EmployeeQuerySkill]
    @csvList varchar(400),
    @years int,
    @fudge int,
    @hitAll int = 0
AS
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @csvLength int
set @csvLength = (select count(*) from SplitCSVStrings(@csvList))

IF @csvLength > 0
BEGIN
    if @hitAll=0 SET @csvLength = 0
    SELECT distinct hits.attribHits as hits, id, last_name+', '+first_name AS emp_name, SUM(CAST(total_experience/12.0 as DECIMAL(5,2))) AS total_exp, labor_grade, title, ptype, @csvList AS pval FROM
        (SELECT e.id, e.last_name, e.first_name, e.labor_grade, e.title, 'skill' AS ptype,
                CASE WHEN r.end_date ='01/01/1901' THEN SUM(datediff(MM,r.start_date, GETDATE())) ELSE SUM(datediff(MM,r.start_date, r.end_date)) END AS total_experience
        FROM [Skillsdb_dev].[dbo].[employee] AS e
        JOIN [Skillsdb_dev].[dbo].[project]             AS prj ON prj.employee_id = e.id
        JOIN [Skillsdb_dev].[dbo].[role]                AS r   ON r.project_id = prj.id
        JOIN [Skillsdb_dev].[dbo].[role_skill]          AS rs  ON rs.role_id = r.id
        JOIN [Skillsdb_dev].[dbo].[skill]               AS s   ON s.id = rs.skill_id
        JOIN SplitCSVStrings(@csvList)            AS CSV ON CSV.val = s.name
        GROUP BY e.id, e.last_name, e.first_name, e.labor_grade, e.title, r.end_date) total_aggregate
    JOIN csvSkillAttribHits(@csvList) AS hits ON hits.empRecId = id
    WHERE total_aggregate.total_experience >= ((@years * 12)-@fudge) AND hits.attribHits >= @csvLength
    GROUP BY id, last_name, first_name, labor_grade, title, ptype,hits.attribHits
    ORDER BY emp_name DESC

END

END

Это работает, пока я не попытаюсь добавить туда второй параметр, которыйчто такое csvList, так что я могу искать "Java, C ++", например

Ответы [ 3 ]

0 голосов
/ 19 ноября 2010

Я думаю, вам нужно сгруппировать по skill_id и суммировать разницу между окончанием проекта и датой начала.

select e.id, s.name, sum(p.end_date-p.start_date) experience
from employee e
, project p
, role r
, role_skill rs
, skill s
where e.id = p.employee_id
and p.id = r.project_id
and r.id = rs.role_id
and rs.skill_id = s.id
group by e.id, s.name;
0 голосов
/ 19 ноября 2010

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

"... WHERE DATEDIFF (гг, дата начала, дата окончания)> = 3"

0 голосов
/ 19 ноября 2010

Попробуйте, основываясь на вашем описании, я думаю, он должен получить то, что вы ищете.Если нет, это приблизит тебя ...

   SELECT e.id, s.name, (r.End_date - r.Start_Date) as 'Experience'
    FROM employee AS e
    INNER JOIN project AS p ON e.id = p.employee_id
    INNER JOIN role AS r ON p.id = r.project_id
    INNER JOIN role_skill AS rs ON rs.role_id = r.id
    INNER JOIN skill as s ON s.id = rs.skill_id
    WHERE s.id = <whatever skill you want to see>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...