例如:select * from table结果如下:ID Title
29 AAA
89 BBB
99 CCC我现在需要的结果
ID Title 编号
29 AAA 1
89 BBB 2
99 CCC 3
29 AAA
89 BBB
99 CCC我现在需要的结果
ID Title 编号
29 AAA 1
89 BBB 2
99 CCC 3
解决方案 »
- 请教Excel2007导入到sql2005出现文本截断错误?
- SQL2005有没有查询触发器?
- 關於循環
- 怎么用SQL 语句找到网上的所有SQL SERVER的名字啊.
- 从表里查询记录,要按某字段筛选掉重复记录(重复记录只保留两条)请问如何实现?
- sqlce3.5 sdf文件如何打开修改表结构?
- ===========只需要SQL个人版=========== 哪里有下?不要4 in 1
- 请问在SQL Server中Group by语句后面可以跟Where子句吗? 谢谢!
- 那位大虾有直连MS SQL SERVER 的控件???
- 数据库设计初期不得不考虑的问题之一===>
- sql集群后,自增型字段如何保证其正确性
- 建立索引的效率、复合链接是否也用到了索引?
CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO--1. 名次生成方式1,Score重复时合并名次
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6
--*/--2. 名次生成方式2,Score重复时保留名次空缺
SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8
--*/
select
*,
编号=(select count(1)+1 from tb where id<t.id)
from tb t
go
create table [tb]([ID] int,[Title] varchar(3))
insert [tb]
select 29,'AAA' union all
select 89,'BBB' union all
select 99,'CCC'select
*,
编号=(select count(1)+1 from tb where id<t.id)
from tb t
--测试结果:
/*
ID Title 编号
----------- ----- -----------
29 AAA 1
89 BBB 2
99 CCC 3(所影响的行数为 3 行)
*/
insert @t select 29, 'AAA'
union all select 89, 'BBB'
union all select 99, 'CCC'
select *,编号=(select count(*) from @t where ID<=a.ID) from @t a order by ID
/*
ID Title 编号
-- ----- ----
29 AAA 1
89 BBB 2
99 CCC 3
(3 行受影响)
*/
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] int,[Title] varchar(3))
insert [tb]
select 29,'AAA' union all
select 89,'BBB' union all
select 99,'CCC'select
*,
(ROW_NUMBER() OVER( ORDER BY [Title]))编号
from tb
如果你用的是sql-2005
select *,(ROW_NUMBER() OVER( ORDER BY [ID])) 编号
from tb
if object_id('tb') is not null
drop table tb
go
create table tb(id int,title varchar(100))
go
insert into tb
select 29,'AAA' union all
select 89,'BBB' union all
select 99,'CCC'
go
select *,编号=identity(int,1,1) into # from tb
select * from #
*,
编号=(select count(1)+1 from tb where id<t.id)
from tb t
order by id结果是这样出来的。这个查询用了表的自连,在本表中,查找id比自己小的纪录又没有,没有的话count(1)就返回0,然后再+1修正这序号。
表1左 表1右
id id
29 29
88 88
99 99
首先表1左的第一条数据29取出来,到表1右全部记录里去检查,没有找到比29更小的,所以xount(1)返回0,所以编号为1;
接着表1左的第二条数据88取出来,到表1右全部记录里去检查,找到一条比他小的,所以count(1)返回1,然后再+1得到编号为2
依次从表1左中取数据,直到扫描完表1左的全部记录位置。