读书人

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

发布时间: 2013-01-22 10:23:54 作者: rapoo

请问这一段语句是不是循环填充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
1
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
1
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

读书人网 >SQL Server

热点推荐