• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

记录排名的小问题,在线等

zuoxingyu 2008-03-23 10:29:42
我们在SQL查询分析器里查询,比如
select * from T
这样是可以把T的所有记录都查出来,而且在分析器的数据表格里,会有个1,2,3,4行标

我现在的问题是,我的查询是排名的,用ORDER BY,可以得到其排名顺序,现在想在记录集里,把排名出来的1,2,3,4等行标做为记录的一列,不知道该怎么处理

还麻烦各位高手多多指教
...全文
81 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
$扫地僧$ 2008-03-24
create table #t
(
姓名 varchar(10) ,
语文 int
)

insert into #t(姓名 , 语文 ) values('张三',73)
insert into #t(姓名 , 语文 ) values('李四',99)
insert into #t(姓名 , 语文 ) values('王十',12)
insert into #t(姓名 , 语文 ) values('李三',34)
insert into #t(姓名 , 语文 ) values('赵六',56)
insert into #t(姓名 , 语文 ) values('目一',15)
insert into #t(姓名 , 语文 ) values('人人',100)
insert into #t(姓名 , 语文 ) values('我产',78)


select (select count(1) from #t where 语文>=T.语文) as 名次,
T.*
from #t T
order by 语文 DESC
回复
fengf840621 2008-03-24
select Id = indentity(int,1,1),* into #tableName From TableName
Select * From #tableName
回复
hui_hui_2007 2008-03-24

drop table #t


create table #t
(
姓名 varchar(10) ,
语文 int
)

insert into #t(姓名 , 语文 ) values('张三',73)
insert into #t(姓名 , 语文 ) values('李四',99)
insert into #t(姓名 , 语文 ) values('王十',12)
insert into #t(姓名 , 语文 ) values('李三',34)
insert into #t(姓名 , 语文 ) values('赵六',56)
insert into #t(姓名 , 语文 ) values('目一',15)
insert into #t(姓名 , 语文 ) values('人人',100)
insert into #t(姓名 , 语文 ) values('我产',78)


drop table #2

select id=identity(int,1,1),* into #2
from #t
order by 语文

select *
from #2

/*
id 姓名 语文
----------- ---------- -----------
1 王十 12
2 目一 15
3 李三 34
4 赵六 56
5 张三 73
6 我产 78
7 李四 99
8 人人 100

(所影响的行数为 8 行)
*/

回复
hui_hui_2007 2008-03-24
16楼方法好,学习了。
回复
Limpire 2008-03-23
-->那就用子查询,反正效率是一样的:

select id=identity(int,1,1),* into # from
(
select cEmployee.EmployeeName,cCard.PressWorkID,Sum(ConsumeMoney) as ConsumeMOney into # from
eConsumeData
left Join cCard on cCard.CardID=eConsumeData.CardID
left Join cEmployee on cEmployee.MaincardID=cCard.CardID
group By cEmployee.EmployeeName,cCard.PressWorkID
) t
order by ConsumeMOney
回复
zuoxingyu 2008-03-23
[Quote=引用 10 楼 Limpire 的回复:]
SQL codeselect id=identity(int,1,1),cEmployee.EmployeeName,cCard.PressWorkID,Sum(ConsumeMoney) as ConsumeMOney into # from
eConsumeData
left Join cCard on cCard.CardID=eConsumeData.CardID
left Join cEmployee on cEmployee.MaincardID=cCard.CardID
group By cEmployee.EmployeeName,cCard.PressWorkID
order By Sum(ConsumeMoney) desc --用字段位置序号排序

select * from #
[/Quote]

我这样测试,结果得到的ID和我正常查询出来的ID不一样啊,也就是说,这个ID,并不是我排序出来的ID
回复
Limpire 2008-03-23
order By ConsumeMOney desc
并不等于 order by sum(ConsumeMOney) desc
回复
Limpire 2008-03-23
select id=identity(int,1,1),cEmployee.EmployeeName,cCard.PressWorkID,Sum(ConsumeMoney) as ConsumeMOney into # from
eConsumeData
left Join cCard on cCard.CardID=eConsumeData.CardID
left Join cEmployee on cEmployee.MaincardID=cCard.CardID
group By cEmployee.EmployeeName,cCard.PressWorkID
order By 4 desc --用字段位置序号排序

select * from #
回复
-狙击手- 2008-03-23
05的row_number()
回复
zuoxingyu 2008-03-23
select id=identity(int,1,1),* into # from T order by ?
select * from #

我这样查出来的ID,并不是排序所得到的顺序呀
是乱的
回复
zuoxingyu 2008-03-23
我说的行标,是在查询分析器里,在所有查询列之前的那个,标明记录的顺序的那个标号
回复
hery2002 2008-03-23
[Quote=引用 2 楼 Limpire 的回复:]
SQL code-->2000
select id=identity(int,1,1),* into # from T order by ?
select * from #

-->2005
select id=row_number() over (order by ?),* from T
[/Quote]
这个就可以了.
回复
kelph 2008-03-23
[Quote=引用 2 楼 Limpire 的回复:]
SQL code-->2000
select id=identity(int,1,1),* into # from T order by ?
select * from #

-->2005
select id=row_number() over (order by ?),* from T
[/Quote]
回复
zuoxingyu 2008-03-23
楼上理解错了,不是行列转换呀
请看下我的代码

select cEmployee.EmployeeName,cCard.PressWorkID,Sum(ConsumeMoney) as ConsumeMOney from
eConsumeData
left Join cCard on cCard.CardID=eConsumeData.CardID
left Join cEmployee on cEmployee.MaincardID=cCard.CardID
group By cEmployee.EmployeeName,cCard.PressWorkID
order By ConsumeMOney desc

我是根据ConsumeMOney 来排序的,但是这样我的记录里只有cEmployee.EmployeeName,cCard.PressWorkID,Sum(ConsumeMoney)着三个字段,我想把顺序也作为一列,放在记录里

回复
-狙击手- 2008-03-23
普通行列转换

假设有张学生成绩表(t)如下

Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94

想变成
姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)

insert into #t(Name , Subject , Result) values('张三','语文','73')
insert into #t(Name , Subject , Result) values('张三','数学','83')
insert into #t(Name , Subject , Result) values('张三','物理','93')
insert into #t(Name , Subject , Result) values('李四','语文','74')
insert into #t(Name , Subject , Result) values('李四','数学','83')
insert into #t(Name , Subject , Result) values('李四','物理','93')

declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name'
exec(@sql)

drop table #t

--结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73

----------------------------------------------------
如果上述两表互相换一下:即

姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

想变成
Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94

create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)

insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
select 姓名 as Name,'物理' as Subject,物理 as Result from #t
order by 姓名 desc

drop table #t

--结果
Name Subject Result
---------- ------- -----------
张三 数学 83
张三 物理 93
张三 语文 73
李四 数学 84
李四 物理 94
李四 语文 74

(所影响的行数为 6 行)
回复
Limpire 2008-03-23
-->2000
select id=identity(int,1,1),* into # from T order by ?
select * from #

-->2005
select id=row_number() over (order by ?),* from T
回复
-狙击手- 2008-03-23
行列转换,

回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-23 10:29
社区公告
暂无公告