sql - INNER JOIN 和计数 POSTGRESQL
问题描述
我正在学习 postgresql 和 Inner join 我有下表。员工
Id Name DepartmentId
1 John S. 1
2 Smith P. 1
3 Anil K. 2
部门
Department
Id Name
1 HR
2 Admin
我想查询返回每个部门的部门名称和员工人数。
SELECT Department.name , COUNT(Employee.id) FROM Department INNER JOIN Employee ON Department.Id = Employee.DepartmentId Group BY Employee.department_id;
我不知道我做错了什么,因为我是数据库查询的新手。
解决方案
当涉及“多”表的所有行或主要部分时,通常先聚合然后再加入会更快。这里肯定是这样,因为我们在计算“每个部门”,根本没有WHERE
条款。
SELECT d.name, COALESCE(e.ct, 0) AS nr_employees
FROM Department d
LEFT JOIN (
SELECT DepartmentId AS id, count(*) AS ct
FROM Employee
GROUP BY DepartmentId
) e USING (id);
还做了一个LEFT [OUTER] JOIN
,以保持部门没有任何员工的结果。并COALESCE
报告0
员工而不是NULL
在那种情况下。
相关,有更多解释:
GROUP BY
在修复子句后,您的原始查询也可以工作:
SELECT Department.name, COUNT(Employee.id)
FROM Department
INNER JOIN Employee ON Department.Id = Employee.DepartmentId
Group BY Department.Id; --!
假设Department.Id
是PRIMARY KEY
表的,在这种情况下,它涵盖了该表的所有列,包括Department.name
. 你可能想要LEFT JOIN
像上面那样。
旁白:在 Postgres 中考虑合法的小写名称。看:
推荐阅读
- python - 通过拖动鼠标旋转对象pygame
- c - 使用 SDL2 的 C 程序不能用 clang 编译
- python - 如何由用户在 django 上查询 sql 以获得模型函数
- android - 如何在listview android中对短信进行排序
- c++ - 特定目标文件的单线程构建
- python - 如何在列表理解中使用正则表达式 re.compile Match() 或 findall()
- python - 将值/键组合成一个字符串并打印
- xaml - 如何在 Xamarin 的堆栈布局中增加包含绘图画布的网格的大小
- sql-server - 创建视图:错误 MSG 156,级别 15,状态 1
- c - 切换大小写以计算单词和字符的数量