最近要完成一个项目,有一个查询可难住了笔者,无论是子查询还是分组,都没弄出来, 还是基础知识不行啊。不过呢,可以查资料,最后用一个窗口函数解决了问题。由于开始的 数据库是Access,后来笔者导成SQL Server的,一下子明白了很多。
数据库类似是这个样子滴:
Employee表的字段:
empId,englishName,depId
Department表的字段:
depId,deptName
需求是:查找出Department表的所有字段,但是在前面显示出该部门的人数。
就是这样:
peopleCount depId deptName
25 1 人力资源部
42 2 市场营销部
一、分组的失败
首先说说分组的概念。根据关系数据库理论,分组的概念是(G,·,e ),其中G 是聚集,·是二目运算,e是G的一个成员,SELECT和GROUP BY的关系如下:
(一)当使用聚集函数(例如count),对于SELECT 列表中的项,如果没有把它当做聚集 函数的参数使用,必须是分组的一部分,例如有一个SQL语句:
SELECT depId
,count(*) as peopleCount
FROM Employee
那就必须在GROUP BY中出现deptId:
SELECT depId
,count(*) as peopleCount
FROM Employee
GROUP BY depId
但是窗口函数是例外的,不必(也不能)出现在Group BY子句中。
而对于可能更改分组(或者聚集函数返回值,例如新的列),则一定要包含在GROUP BY子 句之中。否则就会报错。
时间: 2024-11-03 11:41:29