记录在论坛中解决的一个SQL问题

版权声明:博主原创/资料整理,转载请注明出处!! https://blog.csdn.net/tiegenZ/article/details/79969587

原题路径:点击打开链接

题目截图如下:

表结构与数据如下:


查询语句效果要求:


研究了下编写了如下SQL(只要调整case when 中的总数即可实现效果):

 select 
    C.id,
   (Case when C.num2>=10 then C.num-(C.num2-10) else C.num end)as num
 from( 
     select
       A.id,
       A.num,
       (select Top(2) SUM(num) from dbo.test B where A.id>=B.id) as num2
     from dbo.test A
     where A.num > 0
  )C

效果图:

      当总数等于10时:

           

      当总数等于20时:

           

 但以上SQL还有一个BUG,当总数等于1时, 效果图如下:

           

继续优化SQL,在以上SQL的基础上再嵌套一层查询用于过滤num<0的列,SQL如下:

select 
* 
from (
   select 
     C.id,
     (Case when C.num2>=1 then C.num-(C.num2-1) else C.num end)as num
   from( 
      select
         A.id,
         A.num,
         (select Top(2) SUM(num) from dbo.test B where A.id>=B.id) as num2
      from dbo.test A
      where A.num > 0
    )C
)D where D.num > 0 

当总数等于1时,效果图:


---此题解到这就算结束了,如果有更好的解法请留言


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页