求一条平分件数的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
*/