日期:2014-05-17  浏览次数:20520 次

求一平均分配问题。
表A是客户档案,有5000个客户资料,结构如下:

客户编码 客户名称 月均销量
10001     张三     128000
10002     李四     117000
10003     王五     109000
........
........
现要将5000个客户分成20份,要尽量做到各份的客户数量接近,月均销量总和接近。求解!

------解决方案--------------------
分20份好分,月均销量不好办啊,万一有个数特大的...
------解决方案--------------------
嗯 月销量不大好办....坐等大神解决
------解决方案--------------------
我倒,你这个不行啊
1、必须安装数据仓库的做法,建立维度和度量,这样才能更好的统计。
------解决方案--------------------
客户编码 Custid
客户名称 CustNm
月均销量 MonQty
表名     tb.Sales.Qty 

select Custid, CustNm, MonQty, NTILE(20) over(order by MonQty)
  from tb.Sales.Qty order by MonQty

NTILE(20) 括号中的20就是分20种

------解决方案--------------------
如果数据相差不是很大的话,可以用公用表达式或者临时表一个按升顺一个按降顺各加一个序号列,然后两表通过序号连接,然后取125条,再通过UNION行转列得250条。这个思路不知道符合楼主的意思没?
------解决方案--------------------
引用:
现在我想用另外一种解决方法,我把客户的月均销量按照从高到底排序,然后20等份从高到底各取一个客户,下一轮最后取的先取,一直循环下去,直到取完为止,最后自己将结果微调以平衡。不知道描述得清不清晰,并且求方法。

将数据根据月均销量排序,根据你要分的分数,取出从最高一个+取最低一个
------解决方案--------------------
这东西感觉是基于数据库技术的算法问题啊。
最好搞个存储过程来实现。
在临时表或者视图中新建一个id(id从1开始每次增1)渐增列,并按月均销量排序。
取行数,然后除以20得n,n是id相隔数目。
来20个循环,第一个从id=i(i=1)开始取数据,i++
再来个循环取id=i+n,一直到数据库末尾
这方法取得的月均销量,后面取的会比较大,所以咱可以把部分表倒序了,然后再取,这样应该会比较均匀。

------解决方案--------------------
就实际情况上看,很难找到最优解,只能找到一个满意解。就是不超过平均值的百分之多少就可以。这样比较好计算一点。