select @empname='张三', @nsr=50000, @i=1while(@i<=12) begin if @i<=11 begin insert into bp(xm,yf,gz) select @empname, case @i when 1 then '一月' when 2 then '二月' when 3 then '三月' when 4 then '四月' when 5 then '五月' when 6 then '六月' when 7 then '七月' when 8 then '八月' when 9 then '九月' when 10 then '十月' when 11 then '十一月' when 12 then '十二月' end, cast(@nsr/12*0.9+rand()*@nsr/12*0.2 as decimal(8,1)) end if @i=12 begin insert into bp(xm,yf,gz) select @empname, '十二月', @nsr-(select sum(gz) from bp where xm=@empname) end select @i=@i+1 end -- 结果 select * from bp/* xm yf gz ---------- ---------- ----------------- 张三 一月 3952.1 张三 二月 4511.3 张三 三月 3847.5 张三 四月 4258.7 张三 五月 4469.5 张三 六月 4192.0 张三 七月 4289.5 张三 八月 4376.8 张三 九月 4550.5 张三 十月 4439.3 张三 十一月 4188.2 张三 十二月 2924.6(12 row(s) affected) */ -- 检验 select xm, sum(gz) 'gz' from bp group by xm/* xm gz ---------- -------------- 张三 50000.0(1 row(s) affected) */
张三 50000
李四 78854
王五 65821
赵六 35215
把他们年收入,分到12个月里
如果年收入是1000,除12,商80,余40。
然后,1~6月就是70、60、50、40、30、20;7~12月就是90、100、110、120、130、140。最后,余数的40加到12月,12月就是180。稍麻烦点的方式:
如果年收入是1000,除12,商80,余40。
然后生成一个随机数,用80加上这个随机数,变成7月份工资,80减去这个随机数,变成6月工资;再生成一个随机数,用80加上这个随机数,变成8月份工资,80减去这个随机数,变成5月工资……最后将余数加到12月。比较好的方式:
如果年收入是1000,拿出720平均到每个月是60,剩余280,然后生成一个30以内的随机数(如25),加到60上,就是1月份工资(85),280减去这个随机数(剩余195);再生成一个30以内的随机数(如17),加到60上,就是2月份工资(77),再减去这个随机数(195-17=178)……如果剩余的数不够减了,就减成负数,还是加到60上。当然,每次都要检测是否重复。这样做的好处就是,每个月的工资都会在平均数左右变动,不会出现这个月上万,下个月几十的情况。如果不怕被查,就用第一种方式。怕查,就用最后一种。
这种差异太小 不敢用
这种差异太小 不敢用
如果怕查,就加大随机数大小。
如第三种方式“如果年收入是1000,拿出720平均到每个月是60,剩余280”,改成“如果年收入是1000,拿出360平均到每个月是30,剩余640去产生随机数”。这样范围就会加大很多。
这样范围就会加大很多。
恩 在商量下 用那种好
create table bp
(xm varchar(10),
yf varchar(10),
gz decimal(8,1))
declare @empname varchar(10), -- 姓名
@nsr decimal(8,1), -- 年收入
@i tinyint
select @empname='张三',
@nsr=50000,
@i=1while(@i<=12)
begin
if @i<=11
begin
insert into bp(xm,yf,gz)
select @empname,
case @i when 1 then '一月' when 2 then '二月' when 3 then '三月'
when 4 then '四月' when 5 then '五月' when 6 then '六月'
when 7 then '七月' when 8 then '八月' when 9 then '九月'
when 10 then '十月' when 11 then '十一月' when 12 then '十二月' end,
cast(@nsr/12*0.9+rand()*@nsr/12*0.2 as decimal(8,1))
end if @i=12
begin
insert into bp(xm,yf,gz)
select @empname,
'十二月',
@nsr-(select sum(gz) from bp where xm=@empname)
end select @i=@i+1
end
-- 结果
select * from bp/*
xm yf gz
---------- ---------- -----------------
张三 一月 3952.1
张三 二月 4511.3
张三 三月 3847.5
张三 四月 4258.7
张三 五月 4469.5
张三 六月 4192.0
张三 七月 4289.5
张三 八月 4376.8
张三 九月 4550.5
张三 十月 4439.3
张三 十一月 4188.2
张三 十二月 2924.6(12 row(s) affected)
*/
-- 检验
select xm,
sum(gz) 'gz'
from bp
group by xm/*
xm gz
---------- --------------
张三 50000.0(1 row(s) affected)
*/
版主 可等着你来了
0.9 0.2 是啥意思?补差后有可能会出现负数
版主能给解释下这句话不