笔记:SQL语句基础操作之查询结果,动态改变结果

今天看到别人的问题,在此留下笔记以备以后遇到。

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

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

转载于:https://www.cnblogs.com/ject/archive/2008/09/27/sqlselect.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值