注册 登录
编程论坛 SQL Server论坛

怎样在查询结果中对记录编号

小水滴 发布于 2008-05-21 16:58, 1073 次点击
这里有一个表:
姓名   序号    领用品
张三     1      电脑
李四     2      电脑
张三     3      工具箱
李四     4      打印机
张三     5      办公桌
张三     6       转椅
李四     7      电脑
李四     8      扫描仪
李四     9      办公桌
李四     10     转椅
张三     11     管子钳
李四     12     计算尺

我想在查询的结果集中重新对序号编号,如下:
姓名   序号    领用品
张三     1      电脑
张三     2      工具箱
张三     3      办公桌
张三     4       转椅
张三     5     管子钳
李四     1      电脑
李四     2      打印机
李四     3      电脑
李四     4      扫描仪
李四     5      办公桌
李四     6     转椅
李四     7     计算尺

我做了好久,始终出不来,哪位可以帮帮忙,先谢谢了!
9 回复
#2
happynight2008-05-22 08:25
用临时表加Identity函数
#3
wuhui52017172008-05-22 08:43
select 姓名=name,编号=identity,领用品
from 表 group by name
#4
小水滴2008-05-22 09:45
[bo]以下是引用 [un]wuhui5201717[/un] 在 2008-5-22 08:43 的发言:[/bo]

select 姓名=name,编号=identity,领用品
from 表 group by name


还是出不来,  报错:','附近有语法错误
#5
zougonghua2008-05-22 11:18
select 姓名,identity(int,1,1) as 序号,领用品 INTO #lsTable
from 表 order by 姓名

DELETE 表

INSERT INTO 表
  SELECT * FROM #lsTable

DROP TABLE #lsTable
#6
小水滴2008-05-22 12:04
[bo]以下是引用 [un]zougonghua[/un] 在 2008-5-22 11:18 的发言:[/bo]

select 姓名,identity(int,1,1) as 序号,领用品 INTO #lsTable
from 表 order by 姓名

DELETE 表

INSERT INTO 表
  SELECT * FROM #lsTable

DROP TABLE #lsTable


谢谢您很详细的解答.
只是还是有个问题, 序号是从第一条记录编到最后一条记录的, 而我想要的是每个人都从1开始编号.
#7
happynight2008-05-22 14:38
Create TABLE #ls1(姓名  VARCHAR(10),序号  INT,领用品  VARCHAR(20))
INSERT INTO #ls1 VALUES('张三',     1      ,'电脑')
INSERT INTO #ls1 VALUES('李四',     2      ,'电脑')
INSERT INTO #ls1 VALUES('张三',     3      ,'工具箱')
INSERT INTO #ls1 VALUES('李四',     4      ,'打印机')
INSERT INTO #ls1 VALUES('张三',     5      ,'办公桌')
INSERT INTO #ls1 VALUES('张三',     6      ,' 转椅')
INSERT INTO #ls1 VALUES('李四',     7      ,'电脑')
INSERT INTO #ls1 VALUES('李四',     8      ,'扫描仪')
INSERT INTO #ls1 VALUES('李四',     9      ,'办公桌')
INSERT INTO #ls1 VALUES('李四',     10     ,'转椅')
INSERT INTO #ls1 VALUES('张三',     11     ,'管子钳')
INSERT INTO #ls1 VALUES('李四',     12     ,'计算尺')


SELECT 姓名,IDENTITY(INT,1,1) as 序号,领用品
INTO #lsTable
FROM #ls1 ORDER BY 姓名

SELECT 姓名,(序号 - ISNULL((SELECT Max(a.序号) FROM #lsTable a WHERE a.序号<#lsTable.序号 AND a.姓名<>#lsTable.姓名),0)) AS 序号,领用品
FROM #lsTable

DROP TABLE #ls1
DROP TABLE #lsTable
#8
happynight2008-05-22 14:57
改进版:
SELECT 姓名,(序号 - (SELECT MIN(a.序号) -1 FROM #lsTable a WHERE a.姓名=#lsTable.姓名)) AS 序号,领用品
FROM #lsTable
从理论上来说 效率要高点 程序的可读性也要好点
#9
fangchengli2008-05-22 17:06
不错,
#10
小水滴2008-05-25 08:21
谢谢happynight ,语句非常漂亮,简洁而易懂,向你学习!
1