2010-11-24 25 views
0

J'ai l'instruction SQL/select suivante que je travaille sur la modification. Je tirais ce à partir d'une question précédente, j'avais qui peut être référencé ici: Need help with SQL queryComment rechercher des paires de valeurs dans cette procédure stockée SQL

Cela fonctionne assez bien quand je n'ai pas conditionnel à vérifier là depuis des années d'expérience, mais je veux réellement modifier cette façon que si je avoir une liste passée en @csvList et une autre liste de @csvYears, alors je peux appairer les valeurs - c'est, je peux rechercher Skill1 avec 5 ans d'expérience, et Skill2 avec 3 ans d'expérience.

Puis-je faire juste un autre JOIN sur la table de csvYears? (La fonction SplitCSVStrings retourne une table, et divise la liste CSV des valeurs)

voici donc le code existant:

ALTER PROCEDURE [dbo].[EmployeeQuerySkill] 
    @csvList varchar(400), 
    @years int, 
    @fudge int, 
    @hitAll int = 0 
AS 
BEGIN 
    SELECT last_name, id, name, SUM(Experience) AS 'YearsExperience' 
    FROM 
    (
     SELECT e.last_name, e.id, s.name, CASE WHEN r.end_date ='01/01/1901' THEN MAX(datediff(YY,r.start_date, GETDATE())) ELSE MAX(datediff(YY,r.start_date, r.end_date)) END 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 
     JOIN SplitCSVStrings(@csvList)   AS CSV ON CSV.val = s.name 

    GROUP BY e.last_name, e.id, s.name, r.end_date 
) table1  
    WHERE table1.Experience >= @years 
    GROUP BY last_name, id, name 

    END 
END 

Comment puis-je modifier cela pour me permettre de rechercher une condition différente pour chacun des les compétences? @csvList arrive comme "C++, Java" et je veux @years pour entrer comme "5, 3" et la recherche correspondante pour me montrer les gens qui ont 5 ans d'expérience C++, et 3 ans d'expérience Java.

Merci!

Répondre

3

Je pense que vous devez modifier la fonction SplitCSVStrings pour que cela fonctionne. Yo devrait faire en sorte que la table qu'il renvoie ait une colonne supplémentaire indiquant la position dans le csv. Par exemple, si le paramètre est « C++, Java », le résultat devrait être:

id val 
1 C++ 
2 Java 

Si vous faites cela, vous pouvez modifier votre requête pour être comme ceci:

ALTER PROCEDURE [dbo].[EmployeeQuerySkill] 
    @csvList varchar(400), 
    @years int, 
    @fudge int, 
    @hitAll int = 0 
AS 
BEGIN 
    SELECT last_name, id, name, SUM(Experience) AS 'YearsExperience' 
    FROM 
    (
     SELECT e.last_name, e.id, s.name, CASE WHEN r.end_date ='01/01/1901' THEN MAX(datediff(YY,r.start_date, GETDATE())) ELSE MAX(datediff(YY,r.start_date, r.end_date)) END AS 'Experience', CSV2.val Years 
     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 
     JOIN SplitCSVStrings(@csvList) AS CSV ON CSV.val = s.name 
     LEFT JOIN SplitCSVStrings(@years) AS CSV2 ON CSV.id = CSV2.id 

    GROUP BY e.last_name, e.id, s.name, r.end_date, CSV2.val 
) table1  
    WHERE table1.Experience >= years 
    GROUP BY last_name, id, name 

    END 
END 

En tout Dans ce cas, vous devez faire attention à ce que les paramètres passés dans @csvlist ET @years soient les mêmes.

+0

Le regroupement est-il correctement configuré pour cela? J'ai changé votre ligne en CSV2.val en tant que 'Years' et ajouté 'Years' au groupe par et je ne pouvais toujours pas le faire fonctionner tout à fait – Derek

+0

vous avez raison, désolé, le regroupement était erroné. Je l'ai corrigé maintenant, donc ça devrait marcher – Lamak