代码改变世界

笔记: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,然后再通过外层查询进行具体的计算!

以上两种实现方式相同,这只是一种思路,应该还有其他实现方法,望指出!不胜感谢!!