2017-06-19 119 views
0

相同的外键我有三个表的样子连接两个表具有三表

1。表科 BranchID = FK 名称 地址 联系

2.工作人员 Staff_ID = FK 名称 地址 性别 联系 Supervisor_ID =如果没有一个上司则NULL BranchID

3.表管理 Staff_ID = FK 名称 地址 性别 联系 BranchID

我想列出一个列表,显示每个分支的员工分布情况。包括分行编号,经理姓名,总监人数,以及每个分行的男性和女性员工总数。

如何使用sql语句检索如上所示的结果集?

下面是我的查询

选择Manager.Name,Branch.BranchNum,计数(情况下,当Supervisor_ID为null,则1,否则空结束)作为NumberofSupervisor,计数(情况下,当Staff.gender = '男' 和Supervisor_ID如果男性,计数(当Staff.gender ='女性'和Supervisor_ID不为空,则1为空结束时)作为女性来自Branch.BranchNum = Manager.BranchNum加入职员的女性在Branch.BranchNum = Staff.BranchNum group by Branch.BranchNum

我得到这个错误列'Manager.Name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

你能指导我吗?

谢谢。

+1

那么什么是阻止你?你可以分享你已经尝试过,为什么它不能正常工作吗? –

+0

我想你的意思是说ID列是它们各自表的主键; – SchmitzIT

+2

请问你能分享你想加入的表的表结构和你问题中的确切结果细节吗? –

回答

0

这是一个非常好的自我加入教程。希望这会帮助你。 http://csharp-video-tutorials.blogspot.com/2012/08/self-join-in-sql-server-part-14.html

enter image description here

编写一个查询,这给下面的结果。

enter image description here

自联接查询: 经理也是一个员工。 EMPLOYEE和MANAGER行都存在于同一个表中。在这里,我们使用不同的别名名称联系tblEmployee,E为Employee和M为Manager。我们使用LEFT JOIN来获取ManagerId为NULL的行。你可以在输出中看到TODD的记录也被检索到,但是MANAGER是NULL。如果你用INNER JOIN替换LEFT JOIN,你将不会得到TODD的记录。 作为经理 从tblEmployeeË 选择E.Name作为员工,M.Name左连接tblEmployee中号 在E.ManagerId = M.EmployeeId

总之,随着自身加入一个表被称为自连接。 SELF JOIN不是一种不同类型的JOIN。它可以分为任何类型的JOIN - INNER,OUTER或CROSS Joins。上面的查询是,LEFT OUTER SELF Join。

内在自我加入tblEmployee表: 选择E.Name作为员工,作为M.Name经理 从tblEmployeeË 内加入tblEmployee中号 在E.ManagerId = M.EmployeeId

十字自加入tblEmployee表: 选择E.Name作为员工,M.Name作为经理 来自tblEmployee 交叉加入tblEmployee