从列表中选择平均Y的X#

时间:2017-11-01 15:36:14

标签: sql excel vba solver

我有一个数字列表。我需要找到一种方法来选择那些平均大约为Y的数字的X.

作为一个简单的例子,我们说我的清单是:

30, 40, 50, 60, 70, 80, 90, 100, 110

我需要找到平均值大约为70的三个数字的组合。可能的解决方案可能是60, 70, 8050, 70, 9030, 70, 110

我真的不知道如何开始,所以我担心我没有尝试过多少。我检查了Excel解算器,但无法找到一种方法来获得'或'约束'

我很擅长在Excel中使用VBA并编写SQL代码,但我无法弄清楚如何使用这些技能来解决这个问题。

任何人都有任何关于如何在Excel或SSMS中解决这个问题的想法?如果没有,我应该探索哪些其他选择?

3 个答案:

答案 0 :(得分:0)

我有一个可能的解决方案:

  1. 将您的值填充到数组
  2. 计算平均值
  3. 查找数组中的确切或近似值。
  4. 获取之后的值,1值和之前的值。
  5. 您可以更改第4点的标准。

答案 1 :(得分:0)

DECLARE @Table AS TABLE (I INT)
INSERT INTO @Table VALUES (30),(40),(50),(60),(70),(80),(90),(100),(110)

SELECT
    DISTINCT
    N1 = CASE
          WHEN t1.I < t2.I AND t1.I < t3.I THEN t1.I
          WHEN t2.I < t1.I AND t2.I < t3.I THEN t2.I
          ELSE t3.I
    END
    ,N2 = CASE
          WHEN t1.I > t2.I AND t1.I < t3.I THEN t1.I
          WHEN t1.I < t2.I AND t1.I > t3.I THEN t1.I
          WHEN t2.I > t1.I AND t2.I < t3.I THEN t2.I
          WHEN t2.I < t1.I AND t2.I > t3.I THEN t2.I
          ELSE t3.I
    END
    ,N3 = CASE
          WHEN t1.I > t2.I AND t1.I > t3.I THEN t1.I
          WHEN t2.I > t1.I AND t2.I > t3.I THEN t2.I
          ELSE t3.I
    END
FROM
    @Table t1
    CROSS JOIN @Table t2
    CROSS JOIN @Table t3
WHERE
    t1.I <> t2.I
    AND t1.I <> t3.I
    AND t2.I <> t3.I
    AND (SELECT AVG(V) FROM (VALUES(t1.I),(t2.I),(t3.I)) t(V)) = (SELECT AVG(I) FROM @Table)

基本上,您必须查看3个数字的所有可能组合,以确定平均值是否为70.如果您有一个大表,这可能会对系统资源造成极大的负担。会有一些限制它来减少开销,例如查看所有3个数字是否小于平均值或大于平均值。当您执行所有组合时,您还将获得重复的对/行,因此您必须以这样的方式对值进行排序,以便您可以获得不同的值。如第一列/数字是最小的,第二列是第二列,第三列是最大的......

答案 2 :(得分:0)

这是基于我的评论的SQL方法:

SELECT t.n
FROM t
ORDER BY ABS(t.n-70) ASC
LIMIT 3;

假设你想要3个平均值接近70的数字。

希望有所帮助。