[英]Need help with SQL query
這是我的表格:
employee
-id
project
-id
-employee_id
role
-id
-project_id
-start_date
-end_date
role_skill
-id
-role_id
-skill_id
skill
-id
-name
因此,基本上,一個雇員有很多項目,一個項目有很多角色,一個角色有很多RoleSkills,一個RoleSkill有一個技能
我正在嘗試查詢“具有至少10年經驗的技能1和具有至少3年經驗的技能2”
員工擁有技能多年經驗的位置取決於員工具有列出的技能的角色。
查找具有特定技能的員工的查詢沒有問題,但是一旦我知道他們具有計算經驗年限的技能,我該如何“回頭看”?
謝謝!
這是其中包含當前代碼的存儲過程的示例:
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 ++”
嘗試一下,根據您的描述,我認為它應該能滿足您的要求。 如果沒有,它將使您接近...
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>
我認為您需要對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;
您可以在WHERE子句中使用DATEDIFF函數檢查日期之間的差異是否至少為三年。
“ ... WHERE DATEDIFF(yy,start_date,end_date)> = 3”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.