Welcome

首页 / 软件开发 / .NET编程技术 / 由partition看窗口函数

由partition看窗口函数2011-04-10 博客园 郑浩宇最近要完成一个项目,有一个查询可难住了笔者,无论是子查询还是分组,都没弄出来, 还是基础知识不行啊。不过呢,可以查资料,最后用一个窗口函数解决了问题。由于开始的 数据库是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子 句之中。否则就会报错。