笔记:SQL语句基础操作之查询结果,动态改变结果
2008-09-27 15:45 ClarkZhou 阅读(974) 评论(5) 编辑 收藏 举报今天看到别人的问题,在此留下笔记以备以后遇到。
表T结构
A B
a1 10
a2 10
a3 10
要求:查询后得出如下结果:
A B
a1 10
a2 20
a3 30
实现:
1、sql2005实现:使用了sql2005自带函数RANK() 这里注意:由于B字段值相同不能使用B字段进行RANK,否则结果是序号列的值都会为1,从而导致计算查询结果失败;还有一点需要注意的是被rank的字段不能有相同值,否则将会出现两个相同的序号。如果抛开以上问题,则可以使用ROW_NUMBER()函数替换RANK(),作用是生成唯一行号,这个看起来好像更合理一点 ^ ^。 在此特别感谢 @沈啣结 的提醒。
下面假定A字段无重复值:
1、SELECT A,B*sNO as B FROM (SELECT RANK() OVER (ORDER BY A DESC) AS sNO,
A,B
FROM T) n
2、SELECT A,B*sNO as B FROM (SELECT ROW_NUMBER() OVER (ORDER BY (被查询的任意列)DESC) AS sNO,
A,B
FROM T) n
2、sql2000实现: 修改原因和sql2005实现一样
SELECT A,B*sNO as B FROM (SELECT TOP 100 sNO= (SELECT COUNT(*) FROM T AS A
WHERE A.A<= B.A),
A,B
FROM T AS B ORDER BY 1) n
说明:先通过内部查询动态增加表列名:sNO,然后再通过外层查询进行具体的计算!
以上两种实现方式相同,这只是一种思路,应该还有其他实现方法,望指出!不胜感谢!!