【问题标题】:SQL query select each type of form per employeeSQL查询为每个员工选择每种类型的表格
【发布时间】:2013-12-12 14:54:56
【问题描述】:

我使用的是 MSSQL server 2008 并且有两个表 formsemployees

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

[id][employeeId][formId]

只有 6 种类型的表单,每种都有自己的 id。我将如何构造一个查询来列出每种类型的表格的每个员工以及它们是否已完成(存在于forms 表中)例如

[employeeId][formType1][formType2][formType3]...
 1           1          null       1
 2           1          1          null

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

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

【问题讨论】:

  • 您可以发布您现在使用的选择吗?

标签: sql sql-server database


【解决方案1】:

您可以按员工 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

【讨论】:

  • 如果可以的话,绝对棒极了 +100
  • @Lee Lol'ed at you comment, D Stanley 我想这比我对你在同一个表实例上执行所有操作的纯粹事实的回答更有效......很高兴看到新的方法一样,荣誉!
【解决方案2】:

也许这可以解决问题

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') ;

不完全是您要查找的内容,您可以评估如果为 NULL,则员工不会回答他回答的所有其他问题。我希望这会有所帮助

【讨论】:

    【解决方案3】:

    如果您也想查看那些还没有填写任何表格的员工,那么您可以试试这个:

    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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2021-11-26
      • 2011-09-01
      • 1970-01-01
      • 2011-07-09
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多