SQL查询选择每个员工的每种表单类型

SQL查询选择每个员工的每种表单类型,sql,sql-server,database,Sql,Sql Server,Database,我使用的是MSSQL server 2008,有两个表表单和员工 表单包含员工填写的所有表单,例如 [id][employeeId][formId] 只有6种类型的表单,每种表单都有自己的id。我如何构造一个查询来列出每种类型表单的每位员工,以及这些表单是否已完成(存在于表单表中),例如 编辑:我的当前查询,列出所有需要“过滤”到上面架构的信息: SELECT * FROM forms as f inner join employees as e on e.EmployeeID = f.Em

我使用的是MSSQL server 2008,有两个表
表单
员工

表单
包含员工填写的所有表单,例如

[id][employeeId][formId]
只有6种类型的表单,每种表单都有自己的id。我如何构造一个查询来列出每种类型表单的每位员工,以及这些表单是否已完成(存在于
表单
表中),例如

编辑:我的当前查询,列出所有需要“过滤”到上面架构的信息:

SELECT  *
FROM forms as f
inner join employees as e on e.EmployeeID = f.EmployeeID

也许这能奏效

SELECT emp.[employeeName], form1.formId as formType1, form2.formId as formType2, form3.formId as formType3, form4.formId as formType4, form5.formId as formType5, form6.formId as formType6 
FROM [database_name].dbo.[employees] as emp 
RIGHT OUTER JOIN [database_name].dbo.[form] as form1 ON (emp.[EmployeeID] = form1.[EmployeeID] AND form1.id='ID_FOR_THE_FORM1') 
RIGHT OUTER JOIN [database_name].dbo.[form] as form2 ON (emp.[EmployeeID] = form2.[EmployeeID] AND form2.id='ID_FOR_THE_FORM2') 
RIGHT OUTER JOIN [database_name].dbo.[form] as form3 ON (emp.[EmployeeID] = form3.[EmployeeID] AND form3.id='ID_FOR_THE_FORM3') 
RIGHT OUTER JOIN [database_name].dbo.[form] as form4 ON (emp.[EmployeeID] = form4.[EmployeeID] AND form4.id='ID_FOR_THE_FORM4') 
RIGHT OUTER JOIN [database_name].dbo.[form] as form5 ON (emp.[EmployeeID] = form5.[EmployeeID] AND form5.id='ID_FOR_THE_FORM5') 
RIGHT OUTER JOIN [database_name].dbo.[form] as form6 ON (emp.[EmployeeID] = form6.[EmployeeID] AND form6.id='ID_FOR_THE_FORM6') ;

不完全是你在寻找什么,你可以求值如果为空,那么员工不回答其他形式的问题,他回答它。我希望这有助于

您可以根据员工ID进行分组,并“计算”每种表单类型的实例数:

SELECT  employeeid,
    SUM(CASE WHEN f.ID = 1 THEN 1 ELSE 0 END) formType1,
    SUM(CASE WHEN f.ID = 2 THEN 1 ELSE 0 END) formType2,
    SUM(CASE WHEN f.ID = 3 THEN 1 ELSE 0 END) formType3,
    SUM(CASE WHEN f.ID = 4 THEN 1 ELSE 0 END) formType4,
    SUM(CASE WHEN f.ID = 5 THEN 1 ELSE 0 END) formType5,
    SUM(CASE WHEN f.ID = 6 THEN 1 ELSE 0 END) formType6
FROM forms as f
GROUP BY employeeid

如果您也希望看到未填写任何表格的员工,您可以尝试以下方法:

Select FormName, EmpName, id
FROM 
    (SELECT formID ,FormName , empID, EmpName
            FROM FormTypes  
                CROSS JOIN Emp) x
        LEFT JOIN Forms f on (x.empid = f.employeename and  x.formID = f.formID) 

你可以发布你现在使用的选择吗?如果我could@Lee听了你的评论,D Stanley,我想这比我的答案更有效,因为我的答案是,你在同一个表实例上执行所有操作。。。很高兴看到同样的新方法,太好了!
Select FormName, EmpName, id
FROM 
    (SELECT formID ,FormName , empID, EmpName
            FROM FormTypes  
                CROSS JOIN Emp) x
        LEFT JOIN Forms f on (x.empid = f.employeename and  x.formID = f.formID)