首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教这一段语句是不是循环填充topN列

2013-01-22 
请问这一段语句是不是循环填充topN列?临时表#TblHighRunner里有五列,其中ProductLine, PartNumber, PartDe

请问这一段语句是不是循环填充topN列?

临时表#TblHighRunner里有五列,其中ProductLine, PartNumber, PartDesc, Qty列都已填充,只有TopN列没被填充。这段代码是填充TopN列的,请问其循环机制是怎么样的?我看的很糊涂。

DECLARE @PL VARCHAR(25)
, @PN VARCHAR(25)
, @TopN INT
SET              
@PL = 'DSAM' WHILE (@PL IS NOT NULL) BEGIN
SET  
@PL =
      (SELECT     
   TOP 1 ProductLine
        FROM          
#TblHighRunner
        WHERE      
TopN IS NULL
        ORDER BY 
ProductLine
, Qty DESC)
SET              
@PN =
      (SELECT     
  TOP 1 PartNumber
       FROM          
#TblHighRunner
       WHERE      
   TopN IS NULL
       ORDER BY 
   ProductLine
   , Qty DESC)

UPDATE    #TblHighRunner
SET              
TopN = (CASE WHEN
                      (SELECT     
  MAX(TopN)
                        FROM          
#TblHighRunner
                        WHERE      
ProductLine = @PL) IS NULL 
THEN 1 
ELSE
                      (SELECT     
  MAX(TopN)
                        FROM          
#TblHighRunner
                        WHERE      
ProductLine = @PL) + 1 
END)
WHERE     
ProductLine = @PL 
AND 
PartNumber = @PN
SET              
@TopN = (CASE WHEN
              (SELECT     
  MAX(TopN)
                FROM          
#TblHighRunner
                WHERE      


ProductLine = @PL) IS NULL 
 THEN 

 ELSE
              (SELECT     
  MAX(TopN)
                FROM          
#TblHighRunner) + 1 END) 
END
[解决办法]


大致看了一下   差不多是那么个意思

[解决办法]
DECLARE @PL VARCHAR(25)--定义变量
, @PN VARCHAR(25)
, @TopN INT
SET              
@PL = 'DSAM'--赋值 
WHILE (@PL IS NOT NULL) --如果@PL不为空 进入循环
BEGIN
SET  
@PL =
      (SELECT     
   TOP 1 ProductLine
        FROM          
#TblHighRunner
        WHERE      
TopN IS NULL
        ORDER BY 
ProductLine
, Qty DESC--根据ProductLine,Qty排序  取出第一行的ProductLine并赋值给@PL
)
SET              
@PN =
      (SELECT     
  TOP 1 PartNumber
       FROM          
#TblHighRunner
       WHERE      
   TopN IS NULL
       ORDER BY 
   ProductLine
   , Qty DESC)--根据ProductLine,Qty排序  取出第一行的PartNumber并赋值给@PN

UPDATE    #TblHighRunner
SET              
TopN = (CASE WHEN
                      (SELECT     
  MAX(TopN)
                        FROM          
#TblHighRunner
                        WHERE      
ProductLine = @PL) IS NULL --判断ProductLine = @PL的MAX(TopN)是否为空
THEN 1 --如果为空
ELSE
                      (SELECT     
  MAX(TopN)
                        FROM          
#TblHighRunner
                        WHERE      


ProductLine = @PL) + 1 
END--如果不为空
)
WHERE     
ProductLine = @PL 
AND 
PartNumber = @PN
SET              
@TopN = (CASE WHEN
              (SELECT     
  MAX(TopN)
                FROM          
#TblHighRunner
                WHERE      
ProductLine = @PL) IS NULL 
 THEN 

 ELSE
              (SELECT     
  MAX(TopN)
                FROM          
#TblHighRunner) + 1 END) 

--其实你这里还应该继续给@PL赋值  不然你这是一个死循环吧
END


[解决办法]
给@TopN 赋值这个是多余的吧

如果topn列没有被填充,那么会一直循环的啊
[解决办法]
引用:
我把结果跑出来用
select * 
from #TblHighRunner
order by ProductLine, Qty DESC
后,发现TopN填充的结果是按Qty的数量从高到低赋予序号的!我还是看不懂为什么。

当然了啊

 


循环给这个变量@PL赋值

 SET @PL=(
                     SELECT TOP 1
                            ProductLine
                     FROM   #TblHighRunner
                     WHERE  TopN IS NULL
                     ORDER BY ProductLine , Qty DESC
                    )
第一次得到的是ProductLine 最小,Qty最大的那个
然后
    UPDATE  #TblHighRunner
            SET     TopN=(CASE WHEN (
                                     SELECT MAX (TopN) FROM #TblHighRunner WHERE ProductLine = @PL
                                    ) IS NULL THEN 1
--这里第一次取得topn 是null 所以更新为1
--第二次就是执行下面的else,取最大的加1进行累计
                               ELSE (


                                     SELECT MAX (TopN) FROM #TblHighRunner WHERE ProductLine = @PL
                                    )+1
                          END)



然后把topn 更新完之后 变量@PL 得到的值就是null 了这个时候就跳出循环了。
[解决办法]
引用:
哦,是这样跳出循环的。到最后的时候TopN都被填满,于是以下的WHERE不能被满足,则@PL也会成为NULL,于是循环终止。对吧。
@PL =
      (SELECT     
   TOP 1 ProductLine
        FROM          
#TblHighRunner
        WHERE      
TopN IS NU……

nice

热点排行