none
请教,sql中如何随即拆分数字? RRS feed

  • 问题

  • 有两个值,一个总销量,一个是人数,

    现在需要把总销量随机平分到人上,比如,总销量为100,人数为3,那么将100随机分解为任意的3个数值即可,且分解值之和必须为总销量。

    100=25+40+35

    如果人数为2,100=26+74,我只需要这些分解后的数值。该如何实现?

    2010年5月21日 3:28

答案

  • DECLARE
    	@总数 int,
    	@人数 int
    ;
    
    DECLARE @tb_分配 TABLE(
    	value int
    );
    
    SELECT
    	@总数 = 100,
    	@人数 = 3
    ;
    
    WHILE @人数 > 1
    BEGIN;
    	DECLARE
    		@value int
    	;
    	
    	SELECT
    		@value = 1
    				+ ABS(CHECKSUM(NEWID()))
    					% (@总数 - @人数 + 1),
    		@总数 = @总数 - @value,
    		@人数 = @人数 - 1
    	;
    	
    	INSERT @tb_分配
    	VALUES(
    		@value
    	);
    END;
    
    INSERT @tb_分配
    VALUES(
    	@总数
    );
    
    SELECT 
    	*,
    	(SELECT SUM(value) FROM @tb_分配)
    FROM @tb_分配
    ;
    2010年5月21日 4:40
  • %表示取模,

    例如9%5=4

    x%n=y 这样就保证了y永远小于n


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年5月25日 5:41
    版主

全部回复

  • DECLARE
    	@总数 int,
    	@人数 int
    ;
    
    DECLARE @tb_分配 TABLE(
    	value int
    );
    
    SELECT
    	@总数 = 100,
    	@人数 = 3
    ;
    
    WHILE @人数 > 1
    BEGIN;
    	DECLARE
    		@value int
    	;
    	
    	SELECT
    		@value = 1
    				+ ABS(CHECKSUM(NEWID()))
    					% (@总数 - @人数 + 1),
    		@总数 = @总数 - @value,
    		@人数 = @人数 - 1
    	;
    	
    	INSERT @tb_分配
    	VALUES(
    		@value
    	);
    END;
    
    INSERT @tb_分配
    VALUES(
    	@总数
    );
    
    SELECT 
    	*,
    	(SELECT SUM(value) FROM @tb_分配)
    FROM @tb_分配
    ;
    2010年5月21日 4:40
  • 谢谢,很强大,可以加一个条件,

    if @总数>=@人数

    begin

    end

    ==这一句:@value = 1+ ABS(CHECKSUM(NEWID()))% (@总数 - @人数 + 1)

    没看明白,为什么加1,为什么用%怎么将生成的值控制总数范围的,呵呵,这几个函数的功能都看了,还是不太明白这样取值,能说下就好了。

    2010年5月21日 8:56
  • %表示取模,

    例如9%5=4

    x%n=y 这样就保证了y永远小于n


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年5月25日 5:41
    版主