日期:2014-05-18  浏览次数:20566 次

销售量抽样统计的难题
declare @t table([id] int NOT NULL,pname varchar(10) NULL,num int NULL)
insert into @t select 1,'a',11
union all select 2,'a',23
union all select 3,'b',34
union all select 4,'b',45
union all select 5,'c',56
union all select 6,'b',78
union all select 7,'d',99
union all select 8,'g',100

抽样统计的问题:
如上表,问题描述:
一个抽样数据统计的问题,假设该表为销售情况表,字段分别为流水号,员工姓名,销售量,暂不考虑日

期问题

目标:根据输入的抽样数量,如200,需要计算出这200总量里,各员工销售量所占的比例

思考:
1、随机性,满足条件的记录有很多,则需要从这些记录里随机取出记录,如果顺序读取记录并累加的话

,则每次取出的抽样结果肯定是一样的,这样就不够客观了
2、抽样总数为200,但是取出的记录的和值肯定不一定刚好是200,因此以取出的数据为超过200的最小和

值为准,如和值累加为190,203,210,取203
3、记录补全的问题,查询出的记录里,有可能某些员工并没有销售记录,因此需要补全记录,这个倒好



摆渡:查了下,MSSQL2000里带有统计功能,CREATE STATISTICS这种,但分析下觉得不能满足我这需求

谢谢大家帮忙啦!

------解决方案--------------------
随机选取有各种组合,但需要大于200的最小的组合可能就只能有1-2种,如果还要包含所有销售人员的,可能就只能选到一种,无法实现随机的要求,因此,要么放弃指定数量而是随机抽取每个销售员1-n条记录进行比较,要么指定数量必须满足包含所有的销售员并且销量之和大于或等于200的最小值,但产生随机的可能性很小。
下面是选取包含所有销售员且销量之和大于200的最小值的记录获取。
SQL code
declare   @t   table([id]   int   NOT   NULL,pname   varchar(10)   NULL,num   int   NULL) 
insert   into   @t   select   1,'a',11 
union   all   select   2,'a',23 
union   all   select   3,'b',34 
union   all   select   4,'b',45 
union   all   select   5,'c',56 
union   all   select   6,'b',78 
union   all   select   7,'d',99 
union   all   select   8,'g',100 

declare @s bigint,@min int
select @s = sum(n) from (
select pname p,max(num) n from @t group by pname) a
if @s < 200 
begin
 select '没有符合条件的记录'
 return
end
select @s = sum(n) from (select pname p,min(num) n from @t group by pname) a
set @min = 0
while @s <200
begin
 select @min = min(num) from @t where num > @min
 select @s = sum(n) from (select pname p,min(num) n from @t where num > @min group by pname) a
end
select @s
select pname p,min(num) n from @t where num > @min group by pname