接任务,赚取用不完的金币中国教程网
《Photoshop专家讲堂》光盘热售
参与论坛活动,快速赚取金币精品素材,中英文字体
发新话题
打印

个高难度的MS SQL问题请教各位高手!

个高难度的MS SQL问题请教各位高手!


现有表test结构如下  
No  Type    Quantity  
1        A        21  
2        A        20  
3        A        13  
4        A        15  
5        A        14  
6        A        17  
7        B        11  
8        B        21  
9        B        26  
10      B        22  
11      B        37  
12      B        29  
13      B        28  
14      B        16  
15      B        36  
16      B        25  
17      B        13  
18      B        12  
19      B        20  
20      B        31         
21      C        21   
......  
......  


要求:  
从每个相同类别(Type)的数据中取出几个序号(个数不固定),取出来的序号满足以下几个条件:  
1、取出来的序号对应Quantity的和大于或等于此类别所有序号对应Quantity的和的5/1      (即sub_sum(quantity)>=total_sum(quantity)*0.2)  
2、没有任何其他的序号组合对应Quantity的和比所取出序号对应Quantity的和(即sub_sum(quantity))更小且满足条件1  
3、取出来的序号个数最少  

如上表数据,  
A类取出的最终结果应该是序号2  
B类取出的最终结果应该是序号11,12  
---------------------------------------------------------------  

是用一句SQL文写出吗?那就恐怕没有解了。  
如果用程序实现,倒是可以。  
---------------------------------------------------------------  

你这个问题用SQL语句解决可能效率不高。  
就你所言,当所选的序号个数>1时,肯定要用到类似遍历的解决方法,不过有一些判断可减少需要判断的次数。  

对于这个问题,就我理解数据传输量不大,计算量大,并不是SQL语句(包括存储过程)所擅长的。建议你下传数据到本地用程序解决。  
用程序解决应该很好做,如果有问题,说一声,我再来解决。  
---------------------------------------------------------------  

这个问题用t-sql是能做的,如果你的版本是2000,提供一个思路给你。  

1、求出总和/5放到临时表。  
2、写用户自定义函数f1,功能是求指定Type,大于指定Quantity的Quantity和最小的,指定个数的no组合的列表。  
3、写用户自定义函数f2,功能是求指定Type,大于指定Quantity的Quantity和最小的no组合的列表,这个函数需要根据指定Type的记录体条数来循环调用f1.  

写起来非常复杂,不写了!  


---------------------------------------------------------------  

不过,数据多会很慢。好像是在求一个类似最佳营养配比一样的东东;)

#kt..jcwcn.com@

路过来学习

你这个问题,我想只能用程序来实现~~~
用SQL语句........#@#$#$
发新话题 返回列表