CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

~~~!!!复杂的SQL!!!~~~

楼主DanielSunny(daniel)2006-03-21 10:23:02 在 MS-SQL Server / 基础类 提问

create     table     #t1  
  (  
      id   int     identity,  
      sku_id     int,  
      qty   int     ,  
      avg_qty   decimal(18,2)   default   0  
  )  
   
  insert   into     #t1(sku_id,qty)     values(12,200)  
  insert   into     #t1(sku_id,qty)     values(12,130)  
  insert   into     #t1(sku_id,qty)     values(12,330)  
  insert   into     #t1(sku_id,qty)     values(12,110)  
  insert   into     #t1(sku_id,qty)     values(15,120)  
  insert   into     #t1(sku_id,qty)     values(15,500)  
  insert   into     #t1(sku_id,qty)     values(15,520)  
   
  第1条avg_qty   =   qty  
  第2条avg_qty   =   上一条的avg_qty*0.4+本条qty*0.6  
  第3条依次类推  
  print   200  
  print   200   *   0.4   +   130   *   0.6  
  print   (200   *   0.4   +   130   *   0.6)   *   0.4   +   330   *   0.6  
  print   ((200   *   0.4   +   130   *   0.6)   *   0.4   +   330   *   0.6)*   0.4   +   110   *   0.6  
  print   120  
  print   120   *   0.4   +   500   *   0.6  
  print   (120   *   0.4   +   500   *   0.6)   *   0.4   +   520   *   0.6  
  结果如下:  
  id       sku_id   qty         avg_qty  
  1         12           200         200.00  
  2         12           130         158.00  
  3         12           330         261.20  
  4         12           110         170.48  
  5         15           120         120.00  
  6         15           500         348.00  
  7         15           520         451.20  
   
  求最佳算法SQL 问题点数:100、回复次数:14Top

1 楼iamltd(妖)回复于 2006-03-21 10:40:22 得分 0

看起来只能用游标了,想不出其他办法。  
   
  操作太复杂了,晕啊Top

2 楼geniusli(纠级天使)回复于 2006-03-21 10:47:43 得分 0

我想问问是不是每四条都重新算起?Top

3 楼rivery(river)回复于 2006-03-21 10:49:57 得分 0

declare   @temp   decimal(18,2)  
   
  update   #t1  
  set @temp=case   when   @temp   is   null   then   qty   else   @temp*0.4+qty*0.6   end,  
  avg_qty=@temp                
  select   *   from   #t1    
   
  select   qty   from   #t1   where   1>2  
   
  /*  
  结果  
  1 12 200 200.00  
  2 12 130 158.00  
  3 12 330 261.20  
  4 12 110 170.48  
  5 15 120 140.19  
  6 15 500 356.08  
  7 15 520 454.43  
   
  */Top

4 楼rivery(river)回复于 2006-03-21 10:54:44 得分 0

--如果是每4条一计算。那么:  
  declare   @temp   decimal(18,2)  
   
  update   a  
  set @temp=case   when   @temp   is   null   then   qty    
        when   (select   count(*)   from   #t1   where   id<a.id)=4   then   qty  
        else   @temp*0.4+qty*0.6   end,  
  avg_qty=@temp                
  from   #t1   a  
  select   *   from   #t1    
   
  /*  
  结果  
  1 12 200 200.00  
  2 12 130 158.00  
  3 12 330 261.20  
  4 12 110 170.48  
  5 15 120 120.00  
  6 15 500 348.00  
  7 15 520 451.20  
   
  */Top

5 楼rivery(river)回复于 2006-03-21 10:55:30 得分 0

第一贴中:多了个select   qty   from   #t1   where   1>2,不需要。Top

6 楼DanielSunny(daniel)回复于 2006-03-21 11:08:17 得分 0

这样计算效率不高,行计算了。请用SQL   &   join   作出本题。Top

7 楼popohei(牛头山的小怪)回复于 2006-03-21 11:11:02 得分 0

楼上的可能错了  
  要根据sku_id   来填,Top

8 楼DanielSunny(daniel)回复于 2006-03-21 11:23:57 得分 0

对呀,如果用update那么sku_id也要考虑。Top

9 楼happyflystone(无枪的狙击手)回复于 2006-03-21 11:28:19 得分 50

create     table     #t1  
  (  
      id   int     identity,  
      sku_id     int,  
      qty   int     ,  
      avg_qty   decimal(18,2)   default   0  
  )  
   
  insert   into     #t1(sku_id,qty)     values(12,200)  
  insert   into     #t1(sku_id,qty)     values(12,130)  
  insert   into     #t1(sku_id,qty)     values(12,330)  
  insert   into     #t1(sku_id,qty)     values(12,110)  
  insert   into     #t1(sku_id,qty)     values(15,120)  
  insert   into     #t1(sku_id,qty)     values(15,500)  
  insert   into     #t1(sku_id,qty)     values(15,520)  
   
  go  
   
  declare   @i   numeric(18,4)  
   
  update   #t1   set     @i   =case   when   id   in(select   min(id)   as   id   from   #t1   group   by   sku_id)     then   qty   else   @i*0.4+   0.6*qty   end   ,avg_qty   =   @i  
  select   *   from     #t1  
   
   
  drop   table   #t1Top

10 楼rivery(river)回复于 2006-03-21 11:28:56 得分 50

/*1.这个语句的效率是不高的,但是楼主的问题应该是每条记录的avg_qty都需要进行更新的,不基于行计算,似乎没有更好的方法  
      2。仔细看看,应该是根据sku_id来填充的。原语句修改如下:  
  */  
  declare   @temp   decimal(18,2)  
  declare   @sku_id   int  
  select   @sku_id=0   --此值应该是sku_id中不可能出现的,楼主可实际修改。  
  update   a  
  set @temp=case   when   @sku_id<>sku_id   then   qty          
        else   @temp*0.4+qty*0.6   end,  
  avg_qty=@temp,  
  @sku_id=sku_id  
  from   #t1   a  
  select   *   from   #t1Top

11 楼rivery(river)回复于 2006-03-21 11:30:53 得分 0

--如果是计算所有的avg_qty,那么上面的语句应该是效率最高的了。Top

12 楼geniusli(纠级天使)回复于 2006-03-21 11:33:07 得分 0

不知道楼主想要什么样的方法实现?用递归可以吗?Top

13 楼gaojier1000(V2※高捷)回复于 2006-03-21 11:36:45 得分 0

技术能力不行,我只会用游标处理这样的需求!Top

14 楼happyflystone(无枪的狙击手)回复于 2006-03-21 11:37:51 得分 0

id                     sku_id             qty                   avg_qty                              
  -----------   -----------   -----------   --------------------    
  1                       12                     200                   200.00  
  2                       12                     130                   158.00  
  3                       12                     330                   261.20  
  4                       12                     110                   170.48  
  5                       15                     120                   120.00  
  6                       15                     500                   348.00  
  7                       15                     520                   451.20Top

相关问题

  • 复杂的sql
  • ==============SQL 复杂查询问题===============
  • 一个复杂sql文
  • 有点复杂的SQL
  • 复杂的SQL查询!急!!!!!!!!!!!!!!!!!
  • 复杂的SQL查询!急!!!!!!!!!!!!!!!!!
  • 求一复杂SQL语句。
  • 求一复杂SQL语句
  • 复杂的SQL问题
  • 求一复杂sql语句

关键词

  • 语句
  • t1
  • sku
  • qty
  • avg
  • then qty else
  • insert
  • 计算
  • temp
  • decimal

得分解答快速导航

  • 帖主:DanielSunny
  • happyflystone
  • rivery

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo