为一组检索出的记录自动生成序号或者分序号是较为常见的问题。这主要是为显示有序一些,序号或者分序号也有总数统计的功用。有一些表用int自增的ID作为主键,如果记录不被删除,用它作为序号是完全可以的,但是记录一般都可能被删除,序号就不连续了,用其他类型作为主键就无所谓序号了。
本文说明了如何自动添加序号和分序号的方法,分序号的目的是为了某种分类的需要,给分类的记录添加分序号。
1、表定义:
数据库名称为Demo。
CREATE TABLE [dbo].[User](
[ID] [int] IDENTITY(1,1) NOT NULL,
[姓名] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[性别] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
2、记录示例:
[姓名],[性别]
张山,男
李静,女
李娜,女
李楠,男
王军,男
刘茜,女
3、添加序号命令
SELECT ROW_NUMBER() OVER ( ORDER BY 姓名 ) AS [总序号] , [姓名] , [性别]
FROM [demo].[dbo].[User]
得到:
1 李静 女
2 李娜 女
3 李楠 男
4 刘茜 女
5 王军 男
6 张山 男
4、添加分序号命令
按照姓名分类。
SELECT ROW_NUMBER() OVER ( PARTITION BY [性别] ORDER BY [性别] ) AS [分序号] ,[姓名] , [性别]
FROM [demo].[dbo].[User]
得到:
1 张山 男
2 李楠 男
3 王军 男
1 刘茜 女
2 李静 女
3 李娜 女
5、添加总序号和分序号命令
SELECT ROW_NUMBER() OVER ( ORDER BY [A].[性别] ) AS 总序号 ,[A].[性别] , [A].[分序号] , [A].[姓名]
FROM
(
SELECT ROW_NUMBER() OVER ( PARTITION BY [性别] ORDER BY [性别] ) AS [分序号] ,[姓名] ,[性别]
FROM [demo].[dbo].[User]
) AS A
得到:
1 男 1 张山
2 男 2 李楠
3 男 3 王军
4 女 1 刘茜
5 女 2 李静
6 女 3 李娜
6、要点说明:
- 添加总序号一定给一个排序规则,必须有一个排序字段;
- 填加分序号,要指定分类的字段,先得到一个表,在此表的基础上,再填写总序号。