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

存储过程递归,计算返利问题!!

楼主QY3000(剑魔の独孤秦)2004-12-03 16:52:14 在 MS-SQL Server / 应用实例 提问

现正在做一个推广系统,要求计算返利问题!  
   
  Users(推广员表)  
  ------------------  
  UserID     ParnetID  
   
  如果   ParentID   =   0   则表示为推广经理,ParentId   >   0   则表示为推广员,  
  推广经理下面可以发展推广员,推广员下面还可以发展推广员!  
   
  NCard(卡片表)  
  ------------------  
  CardId     RequestID  
   
  如下SQL语句可以查询@id这个人本身推广的卡片数量:  
  select   count(1)   from   NCard   where   RequestId   =   @id  
   
  每个人的返利计算公式如下:(递归定义)  
   
  本人发展的卡片数   +   所有下线发展的卡片数   *   0.3  
   
   
   
  现在要求所有人的返利情况,请达人帮忙!!急!!!  
   
   
   
  问题点数:100、回复次数:13Top

1 楼yelook(香槟酒)回复于 2004-12-03 17:03:01 得分 0

CREATE   PROCEDURE   GetIDS  
  (  
  @PID   int  
  )  
  AS  
  DECLARE    
  @higherID   int,      
  @intCount   int  
  set   @higherID   =   @PID  
  declare     @tb_Result   TABLE(ID   int)    
  declare     @tb_Parent   TABLE(ID   int)  
  declare     @tb_Child   TABLE(ID   int)  
  INSERT   INTO   @tb_Parent(ID)   VALUES   (@higherID)                  
  SELECT   @intCount   =   COUNT(*)      
  FROM   UserTableName      
  WHERE     (PID   =   @higherID)    
  WHILE   @intCount   <>   0   --   有下级  
  BEGIN  
  DELETE   @tb_Child     /*   清空子表   */  
  INSERT   INTO   @tb_Child(ID)  
  SELECT   ID   FROM   UserTableName  
  WHERE     (PID   in   (SELECT   ID   FROM   @tb_Parent))  
  SELECT   @intCount   =   COUNT(*)     FROM       @tb_Child  
  INSERT   INTO   @tb_Result(ID)     SELECT   ID     FROM       @tb_Child  
  DELETE   FROM   @tb_Parent  
  INSERT   INTO   @tb_Parent(ID)   SELECT   ID   FROM       @tb_Child  
  END  
  insert   into   @tb_Result(ID)   values   (@higherID)  
   
   
   
  select   count(*),ID   from   usertablename   where   id   in   (select   id   from   @tb_Result)   group   by   IDTop

2 楼hai2003xp(古井小调)回复于 2004-12-03 17:39:46 得分 0

學習!Top

3 楼zhang_yzy(六子儿)回复于 2004-12-03 18:10:28 得分 0

select   a.Userid   ,IsNull(b.sl,0)+IsNull(c.sl,0)*0.3   as   返利  
      from   Users   a    
                left   join    
                    (select   RequestID   as   id   ,count(cardId)   as   sl  
                          from   NCard   where   RequestID   =@id   )   b  
                    on   a.Userid=b.id    
                left   join    
                    (select   c.useid   as   id   ,count(d.cardId)   as   sl  
                          from   NCard   d   inner   join   Users   c   on   d.RequestId   =c.Userid    
                          where   d.RequestID   =@id   )   e  
                    on   a.Userid   =e.id    
      where   a.Userid   =@id  
  仅支持直接下线的返利方式Top

4 楼QY3000(剑魔の独孤秦)回复于 2004-12-03 18:36:03 得分 0

能不能说明一下啊,我执行了,返回结果为:  
   
  1 1  
  1 2  
  1 3  
  1 4  
  1 5  
  1 6  
  1 7  
  1 8  
  1 9  
  1 10  
  1 11  
  1 12  
  1 13  
  1 14  
  1 15  
  1 16  
  1 17  
  1 18  
  1 19  
  1 20  
  1 21  
  1 22  
  1 23  
  1 24  
  1 25  
  1 26  
  1 27  
  1 28  
  1 29  
  1 30  
  1 31  
  1 32  
  1 33  
  1 34  
  1 35  
  1 36  
  1 37  
  1 38  
  1 39  
  1 40  
  1 41  
  1 42  
  1 43  
  1 44  
  1 45  
  1 46  
  1 47  
  1 48  
  1 49  
  1 50  
  1 51  
  1 52  
  1 53  
  1 54  
  1 55  
  1 56  
  1 57  
  1 58  
  1 59  
  1 60  
  1 61  
  1 62  
  1 63  
  1 64  
  1 65  
  1 66  
  1 67  
  1 68  
  1 69  
  1 70  
  1 71  
  1 72  
  1 73  
  1 74  
  1 75  
  1 76  
  1 77  
  1 78  
  1 79  
  1 80  
  1 81  
  1 82  
  1 83  
  1 84  
  1 85  
  1 86  
  1 87  
  1 88  
  1 89  
  1 90  
  1 91  
  1 92  
  1 93  
  1 94  
  1 96  
  1 97  
  1 98  
  1 99  
  1 100  
  1 101  
  1 102  
  1 103  
  1 104  
  1 105  
  1 106  
  1 107  
  1 108  
  1 109  
  1 110  
  1 111  
  1 112  
  1 113  
  1 114  
  1 115  
  1 116  
  1 117  
  1 118  
  1 119  
  1 120  
  1 121  
  1 122  
  1 123  
  1 124  
  1 125  
  1 126  
  1 127  
  1 128  
  1 129  
  1 130  
  1 131  
  1 132  
  1 133  
  1 134  
  1 135  
  1 136  
  1 137  
  1 138  
  1 139  
  1 140  
  1 141  
  1 142  
  1 143  
  1 144  
  1 145  
  1 146  
  1 147  
  1 148  
  1 149  
  1 150  
  1 151  
  1 152  
  1 153  
  1 154  
  1 155  
  1 156  
  1 157  
  1 158  
  1 159  
  1 160  
  1 161  
  1 162  
  1 163  
  1 164  
  1 165  
  1 166  
  1 167  
  1 168  
  1 169  
  1 170  
  1 171  
  1 172  
  1 173  
  1 174  
  1 175  
  1 176  
  1 177  
  1 178  
  1 179  
  1 180  
  1 181  
  1 182  
  1 183  
  1 184  
  1 185  
  1 186  
  1 187  
  1 188  
  1 189  
  1 190  
  1 191  
  1 192  
  1 193  
  1 194  
  1 195  
  1 196  
  1 197  
  1 198  
  1 199  
  1 200  
  1 201  
  1 202  
  1 203  
  1 204  
  1 205  
  1 206  
  1 207  
  1 208  
  1 209  
  1 210  
  1 211  
  1 212  
  1 213  
  1 214  
  1 215  
  1 216  
  1 217  
  1 218  
  1 219  
  1 220  
  1 221  
  1 222  
  1 223  
  1 224  
  1 225  
  1 226  
  1 227  
  1 228  
  1 229  
  1 230  
  1 231  
  1 232  
  1 233  
  1 234  
  1 235  
  1 236  
  1 237  
  1 238  
  1 239  
  1 240  
  1 241  
  1 242  
  1 243  
  1 244  
  1 245  
  1 246  
  1 247  
  1 248  
  1 249  
  1 250  
  1 251  
  1 252  
  1 253  
  1 254  
  1 255  
  1 256  
  1 257  
  1 258  
  1 259  
  1 260  
  1 261  
  1 262  
  1 263  
  1 264  
  1 267  
  1 268  
  1 269  
  1 270  
  1 271  
  1 272  
  1 273  
  1 274  
  1 275  
  1 276  
  1 277  
  1 278  
  1 279  
  1 280  
  1 281  
  1 282  
  1 283  
  1 284  
  1 285  
  1 286  
  1 287  
  1 288  
  1 289  
  1 290  
  1 291  
  1 292  
  1 293  
  1 294  
  1 295  
  1 296  
  1 297  
  1 298  
  1 299  
  1 300  
  1 301  
  1 302  
  1 303  
  1 304  
  1 305  
  1 306  
  1 307  
  1 308  
  1 309  
  1 310  
  1 311  
  1 312  
  1 313  
  1 314  
  1 315  
  1 316  
  1 317  
  1 318  
  1 319  
  1 323  
  1 324  
  1 325  
  1 326  
  1 332  
  1 333  
  1 334  
  1 335  
  1 336  
  1 337  
  1 338  
  1 339  
  1 340  
  1 341  
  1 342  
  1 343  
  1 344  
  1 345  
  1 346  
  1 347  
  1 348  
  1 349  
  1 350  
  1 351  
  1 352  
  1 353  
  1 354  
  1 355  
  1 356  
  1 357  
  1 358  
  1 359  
  1 360  
  1 361  
  1 362  
  1 363  
  1 364  
  1 365  
  1 366  
  1 367  
  1 368  
  1 369  
  1 370  
  1 371  
  1 372  
  1 373  
  1 374  
  1 375  
  1 376  
  1 377  
  1 378  
  1 379  
  1 380  
  1 381  
  1 382  
  1 383  
  1 384  
  1 385  
  1 386  
  1 387  
  1 388  
  1 389  
  1 390  
  1 391  
  1 392  
  1 393  
  1 394  
  1 395  
  1 396  
  1 397  
  1 398  
  1 399  
  1 400  
  1 401  
  1 402  
  1 403  
  1 404  
  1 405  
  1 406  
  1 407  
  1 408  
  1 409  
  1 410  
  1 411  
  1 412  
  1 413  
  1 414  
  1 417  
  1 418  
  1 419  
  1 420  
  1 421  
  1 422  
  1 423  
  1 424  
  1 425  
  1 426  
  1 427  
  1 428  
  1 429  
  1 430  
  1 431  
  1 432  
  1 433  
  1 434  
  1 435  
  1 436  
  1 437  
  1 438  
  1 439  
  1 440  
  1 441  
  1 442  
  1 443  
  1 444  
  1 445  
  1 446  
  1 447  
  1 448  
  1 449  
  1 450  
  1 451  
  1 452  
  1 453  
  1 454  
  1 455  
  1 456  
  1 457  
  1 458  
  1 459  
  1 460  
  1 461  
  1 462  
  1 463  
  1 464  
  1 465  
  1 466  
  1 467  
  1 468  
  1 469  
  1 470  
  1 471  
  1 472  
  1 473  
  1 474  
  1 475  
  1 476  
  1 477  
  1 478  
  1 479  
  1 480  
  1 481  
  1 482  
  1 483  
  1 484  
  1 485  
  1 486  
  1 487  
  1 488  
  1 489  
  1 490  
  1 491  
  1 492  
  1 493  
  1 494  
  1 495  
  ----------------------------  
   
  不知道是何解?Top

5 楼zhang_yzy(六子儿)回复于 2004-12-03 18:44:09 得分 0

是说我的吗Top

6 楼QY3000(剑魔の独孤秦)回复于 2004-12-03 18:46:28 得分 0

to   zhang_yzy(六子儿)    
   
  你的语句太复杂,而且好像写错了,不能执行!!Top

7 楼QY3000(剑魔の独孤秦)回复于 2004-12-03 18:47:03 得分 0

是说   《雨枫》的Top

8 楼QY3000(剑魔の独孤秦)回复于 2004-12-03 18:49:43 得分 0

to   zhang_yzy:  
   
  服务器:   消息   107,级别   16,状态   2,行   1  
  列前缀   'c'   与查询中所用的表名或别名不匹配。Top

9 楼zhang_yzy(六子儿)回复于 2004-12-03 18:51:29 得分 0

抱歉上边的写错了一个地方,现在的可以了  
  select   a.Userid   ,IsNull(b.sl,0)+IsNull(e.sl,0)*0.3   as   返利  
      from   Users   a    
                left   join    
                    (select   RequestID   as   id   ,count(cardId)   as   sl  
                          from   NCard   where   RequestID   =@id   )   b  
                    on   a.Userid=b.id    
                left   join    
                    (select   c.useid   as   id   ,count(d.cardId)   as   sl  
                          from   NCard   d   inner   join   Users   c   on   d.RequestId   =c.Userid    
                          where   d.RequestID   =@id   )   e  
                    on   a.Userid   =e.id    
      where   a.Userid   =@id  
  Top

10 楼QY3000(剑魔の独孤秦)回复于 2004-12-03 19:05:13 得分 0

服务器:   消息   8118,级别   16,状态   1,行   1  
  列   'NCard.RequestID'   在选择列表中无效,因为该列未包含在聚合函数中,并且没有   GROUP   BY   子句。  
  服务器:   消息   8118,级别   16,状态   1,行   1  
  列   'c.UserID'   在选择列表中无效,因为该列未包含在聚合函数中,并且没有   GROUP   BY   子句。  
  Top

11 楼lin_now(林)回复于 2004-12-03 19:39:12 得分 0

传销系统   ^_^!~~~~~~~~~~~~~~~~~~~~~~~~~Top

12 楼winternet(冬天)回复于 2004-12-03 23:15:25 得分 0

MARKTop

13 楼zjcxc(邹建)回复于 2004-12-04 09:15:27 得分 100

--试试  
   
  --初始化   生成处理临时表  
  select   UserID,ParnetID,xf=count(b.CardId),yj=-1  
  into   #t  
  from   Users   a  
  left   join   NCard   b   on   a.UserID=b.RequestID  
  group   by   a.UserID,ParnetID  
   
  --分级计算卡片数  
  update   #t   set   yj=xf  
  from   #t   a  
  where   not   exists(  
  select   1   from   #t   where   ParnetID=a.UserID)  
  while   @@rowcount>0  
  update   #t   set   yj=isnull(a.xf,0)+isnull(b.yj,0)  
  from   #t   a   join(  
  select   ParnetID,yj=sum(yj)   from   #t  
  where   yj>=0   group   by   ParnetID  
  )b   on   a.UserID=b.ParnetID  
  where   a.yj=-1   and   not   exists(  
  select   1   from   #t   where   ParnetID=a.UserID   and   yj=-1)  
   
  --显示最终结果  
  select   UserID,卡片数=xf+(yj-xf)*.3   from   #tTop

相关问题

  • 递归存储过程 急!!!!
  • 存储过程计算问题
  • 求助,存储过程递归调用问题,急!!!!!
  • 在 SQL SERVER 的存储过程里可以写 "递归" 吗 ?
  • sql server 的存储过程如何实现递归???
  • 请问存储过程能否递归调用?
  • java 调用 sql server 递归存储过程问题
  • 存储过程嵌套,递归出问题
  • 存储过程里能不能实现递归?
  • 请教一下sqlserver存储过程递归有限制吗?

关键词

  • 卡片
  • 服务器
  • 消息
  • requestid
  • ncard
  • parnetid
  • yj
  • userid
  • higherid
  • cardid

得分解答快速导航

  • 帖主:QY3000
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

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