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

求一条等分件数的SQL

2013-11-18 
求一条平分件数的SQLdeclare @t table(id int,p int,g numeric(18,2),m numeric(18,2))insert into @t(id,

求一条平分件数的SQL
declare @t table(id int,p int,g numeric(18,2),m numeric(18,2))
insert into @t(id,p,g,m)
select 1001,3,40.00,4.0 union all
select 1002,30,900.00,75.00 union all
select 1003,10,800.00,70.00

平分条件只有一个值 ,比如我输入: 2 想得到如下数据:


/*
groupName   id          p           g           m
----------- ----------- ----------- ----------- -----------
1           1001        3           40          4
1           1002        18          540         45
2           1002        12          360         30
2           1003        10          800         70
*/


如果输入3应该会分成3份。
[解决办法]
真的,没看很明白.要求达到什么效果
[解决办法]
的确描述的不清楚
输入个2 是想分第二条记录? 按什么规则分? 你一楼的表述看数据应该是分成5份,按3:2的比例分配,按id排序。后面的回复那个看起来是按7:3的比例分配,但是排序规则又按什么?
[解决办法]
你敢把需求说的更不明白点么?

既然来提问了,就把问题说的清楚明了些。

这样让别人猜你的意图,浪费时间,浪费精力,你说呢?
[解决办法]
经过我的深思熟虑,其实你的意思。。。真不明白什么意思。嘿
[解决办法]
按ID顺序切分?
[解决办法]
硬是没看懂是怎么分的?
[解决办法]
DECLARE @t TABLE
        (
         id INT ,
         p INT ,
         g NUMERIC(18 , 2) ,
         m NUMERIC(18 , 2)
        )
INSERT  INTO @t (id , p , g , m)
        SELECT  1001 , 3 , 40.00 , 4.0
        UNION ALL
        SELECT  1002 , 30 , 900.00 , 75.00
        UNION ALL
        SELECT  1003 , 10 , 800.00 , 70.00

DECLARE @tb TABLE
        (
         id INT ,
         p INT ,
         g NUMERIC(18 , 2) ,
         m NUMERIC(18 , 2)
        )

DECLARE @cnt INT ,
        @i INT ,
        @j INT ,
        @id INT ,
        @p INT ,
        @p_new INT ,
        @g NUMERIC(18 , 2) ,
        @g_new NUMERIC(18 , 2) ,
        @m NUMERIC(18 , 2) ,
        @m_new NUMERIC(18 , 2) ,
        @w INT 
SET @i = 2/*这里设置分组次数*/
SET @j = 1
SELECT  @cnt = SUM(p)
FROM    @t

INSERT  INTO @tb
        SELECT  *
        FROM    @t
        WHERE   p <= @cnt / @i

DECLARE c CURSOR 
FOR
SELECT * FROM @t WHERE p>@cnt/@i
OPEN c
FETCH NEXT FROM c INTO @id ,@p, @g,@m ;
WHILE @@FETCH_STATUS = 0 


      BEGIN
SET @w = @p
            WHILE @j <= @i 
                  BEGIN
                        SET @p_new = @cnt / @i
                        IF @w<=0
BREAK
                        IF @w < @p_new 
                           SET @p_new = @w
 
                        SET @g_new = @p_new * 1.0 / @p * @g
                        SET @m_new = @p_new * 1.0 / @p * @m
                        INSERT  INTO @tb
                        VALUES  (@id , @p_new , @g_new , @m_new)
                        SET @j = @j + 1
                        
                        SET @w = @w - @p_new
                  END 
            FETCH NEXT FROM c INTO @id ,@p, @g,@m ;

      END
CLOSE c ;
DEALLOCATE c ;

SELECT  *
FROM    @tb AS t

/*
idpgm
1001340.004.00
100310800.0070.00
100221630.0052.50
10029270.0022.50

*/

热点排行