簡體   English   中英

需要有關SQL查詢的幫助

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM