sql - 这些表格设置有意义吗?尝试执行特定的 SQL 查询
问题描述
员工表
emp_no emp_fname emp_lname job_title job_begin
18316 John Barrimore Driver 6/1/2015
28559 Sybill Moser --- 8/1/2015
28559 Sybill Moser Engineer 2/1/2016
33355 Peter Fisher --- ---
2581 Elke Hansel Analyst 10/15/2015
9031 Elsa Bertoni Manager 4/15/2015
9031 Elsa Bertoni Engineer 11/15/2014
29346 James James Engineer 1/4/2015
29346 James James --- 12/15/2014
30606 Kathie Willson Analyst 9/25/2015
30606 Kathie Willson Programmer ---
10102 Ann Jones Analyst 10/1/2014
10102 Ann Jones Manager 1/1/2012
25348 Jerry Smith Engineer 2/15/2015
--- --- --- --- ---
31189 Julia White --- ---
35500 Ben Wells --- ---
--- --- --- --- ---
5500 Paul Fisher QA ---
5500 Paul Fisher Programmer 11/9/2016
5500 Paul Fisher QA 3/22/2016
5500 Paul Fisher Manager 1/18/2013
34427 Matthew Arrow --- ---
--- --- --- --- ---
部门表
emp_no dept_no dept_name dept_location
18316 d1 R&D Dallas, TX
28559 d1 R&D Dallas, TX
28559 d1 R&D Dallas, TX
33355 d1 R&D Dallas, TX
2581 d2 Accounting Tampa, FL
9031 d2 Accounting Tampa, FL
9031 d2 Accounting Tampa, FL
29346 d2 Accounting Tampa, FL
29346 d2 Accounting Tampa, FL
30606 d2 Accounting Tampa, FL
30606 d2 Accounting Tampa, FL
10102 d3 Marketing Miami, FL
10102 d3 Marketing Miami, FL
25348 d3 Marketing Miami, FL
--- --- Shipping Atlanta, GA
31189 d5 Sales Tampa, FL
35500 d5 Sales Tampa, FL
--- --- Customer Service St. Louis, MO
5500 --- --- ---
5500 --- --- ---
5500 --- --- ---
5500 --- --- ---
34427 --- --- ---
--- --- --- ---
项目表
emp_no proj_no proj_name proj_budget
18316 p2 Gemini $95,000.00
28559 p1 Anchor $120,000.00
28559 p2 Gemini $95,000.00
33355 --- --- ---
2581 p3 Jet $186,500.00
9031 p1 Anchor $120,000.00
9031 p3 Jet $186,500.00
29346 p1 Anchor $120,000.00
29346 p2 Gemini $95,000.00
30606 p11 Sea Star ---
30606 p20 Hunter-II ---
10102 p1 Anchor $120,000.00
10102 p3 Jet $186,500.00
25348 p2 Gemini $95,000.00
--- --- --- ---
31189 --- --- ---
35500 --- --- ---
--- --- --- ---
5500 p11 Sea Star ---
5500 p14 Blue Sky $300,000.00
5500 p2 Gemini $95,000.00
5500 p20 Hunter-II ---
34427 --- --- ---
--- --- Winner $300,000.00
我正在尝试找到同一部门拥有最多员工的项目,但我不确定是否可以给出如何设置表数据。我在每个表中都包含了 emp_no 列,这样我可以更轻松地进行连接,但我仍然不确定如何去做。标题给了我,我认为这是设置数据的最佳方式;但是,我对如何解决这个问题感到困惑。
解决方案
假设一名员工只属于一个部门,那么不,该表设置不是一个好的架构设计。该Department
表不应包括emp_no
. 每个部门实体应该只有一行,并且Employee
表还应该包含一个dept_no
字段。
如果假设是错误的,并且可能列出的员工有多个部门,则仍然emp_no
从Department
表中删除并减少到每个部门一行。但是现在,您无需添加dept_no
到表中,而是创建了一个包含和字段Employee
的附加EmployeeDeptartments
表,用于将员工分配到部门。如果您想随时间跟踪员工位置,这也很有用,知道员工过去某个时间曾在特定部门工作是很有价值的。您可以通过将日期时间字段添加到表中来做到这一点。emp_no
dept_no
同样的事情也适用于Project
桌子。每个项目该表应该只有一行,并且您需要一个单独的EmployeeProjects
表来查看人们在做什么。
这个很重要!例如,我看到项目p1
有几行,每行的预算为 120,000,000 美元。您不希望该项目表中的某一行以某种方式以与同一项目的其他行不同的预算数字结束。
稍后,您可以通过使用语句编写查询来获得看起来像当前Project
或表的列表。Department
JOIN
“我正在努力寻找同一部门员工最多的项目。”
选择员工只能属于一个部门的选项,看起来像这样:
SELECT TOP 1 p.proj_no, p.proj_name, e.dept_no, COUNT(e.emp_no) As NumEmployeesByDept
FROM Project p
INNER JOIN EmployeeProjects ep on ep.proj_no = p.proj_no
INNER JOIN Employee e on e.emp_no = ep.emp_no
GROUP BY p.proj_no, p.proj_name, e.dept_no
ORDER BY COUNT(e.emp_no) DESC
您还可以使用窗口函数而不是聚合来处理可能存在关联的情况。
推荐阅读
- java - 如何在 Spring Boot 中加入 SQL 表?
- kotlin - 访问同一文件中类的私有成员的函数
- linux - dwm 补丁将标签中的所有窗口发送到另一个标签
- python - 了解模乘逆的内部工作原理
- javascript - 为什么我在传入参数时将 History、Location、Match、Static 作为对象?
- c - 从二进制文件中去除特定符号
- r - R Jags 中的泊松模型 - 节点 NbBones[4] 中的错误节点与父节点不一致
- linux - 在 postgresql 中创建一个只读组
- php - 在子目录中创建新页面 - Laravel 8
- javascript - JS 代码在本地主机上工作,但在服务器上不工作