一个高难度的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.

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

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

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

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus