一列数字随机求和等于某数的算法(整理)

现在有一个表Table1进行随机查询, 检索结果记录条数不限, 但是要求Num求和结果为一个固定值,如结果为15

ID    NUM
1    5
2    3
3    2
4    5
5    4
6    5
7    3
8    2
9    4
10    3

 

IF OBJECT_ID('[tb]') IS NOT NULL

    DROP TABLE [tb]

GO

CREATE TABLE [tb]

(

    [ID] INT, [Num] INT

)

INSERT [tb]

SELECT 1, 5 UNION ALL

SELECT 2, 3 UNION ALL

SELECT 3, 2 UNION ALL

SELECT 4, 5 UNION ALL

SELECT 5, 4 UNION ALL

SELECT 6, 5 UNION ALL

SELECT 7, 3 UNION ALL

SELECT 8, 2 UNION ALL

SELECT 9, 4 UNION ALL

SELECT 10, 3

GO

--select * from [tb]

 

-->SQL2005以上

;WITH t AS

(

    SELECT *, PATH = CAST(id AS VARCHAR), total = num

    FROM tb

    UNION ALL

    SELECT b.id, b.num, CAST(a.path+'-'+RTRIM(b.id) AS VARCHAR), a.total+b.num

    FROM t a

    JOIN tb b

        ON  a.id<b.id

            AND a.total+b.num <= 15

)

SELECT id, num

FROM tb, (

         SELECT TOP 1 PATH

         FROM t

         WHERE total = 15

         ORDER BY NEWID()

     ) a

WHERE CHARINDEX('-'+RTRIM(id)+'-', '-'+PATH+'-')>0

/*

id          num

----------- -----------

3           2

4           5

6           5

7           3

 

(4 行受影响)

*/

 

-->SQL2000以上

DECLARE @idtb TABLE(id INT)

DECLARE @num INT, @id INT, @sum  INT

SET @sum = 0

WHILE @sum<>15

BEGIN

    SELECT TOP 1 @id = id, @num = num

    FROM tb

    WHERE num<= 15

    ORDER BY NEWID()

    IF @num=15

        INSERT INTO @idtb

        SELECT @id

    ELSE

    IF NOT EXISTS(

           SELECT 1

           FROM @idtb

           WHERE id = @id

       )

        INSERT INTO @idtb

        SELECT @id

    SELECT @sum = SUM(num)

    FROM tb

    WHERE id IN (

    SELECT id

        FROM @idtb

       )

    IF (@sum>15)

    BEGIN

        DELETE @idtb

    END

END

 

SELECT *

FROM tb

WHERE id IN (

    SELECT id

    FROM @idtb

    )

/*

ID          Num

----------- -----------

3           2

4           5

6           5

10          3

 

(4 行受影响)

*/

 

http://topic.csdn.net/u/20090421/12/5113c4ab-4631-4dc9-be9f-e6d88f0526d8.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值