Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从多个范围查找值的最佳方法_Sql_Database_Vba_Ms Access - Fatal编程技术网

Sql 从多个范围查找值的最佳方法

Sql 从多个范围查找值的最佳方法,sql,database,vba,ms-access,Sql,Database,Vba,Ms Access,我需要确定一个值适合的范围,以便确定适当的折扣。只是想在Access 2016中确定实现这一目标的最佳、最有效的方法。以下是一个简化的表格: 我的第一个想法是循环一个记录集,计算每个记录的>=从$and==[From] 并且@Value=d.[从$]的位置?我将测试这些建议并报告。与此同时,我还发现了另一个例子,在这个例子中,你只需要存储一个范围的起始点,这个范围可能有意义,但我很难理解这个概念。我只是想知道这对任何人来说是否有意义。如果你使用“仅起点”的概念,那么你的“发件人”列将看起来像0、

我需要确定一个值适合的范围,以便确定适当的折扣。只是想在Access 2016中确定实现这一目标的最佳、最有效的方法。以下是一个简化的表格:

我的第一个想法是循环一个记录集,计算每个记录的>=从$and=<到$and,直到找到一个范围匹配,然后获取折扣率。有没有更有效的方法使用SQL语句执行此操作?

我们可以在此处尝试使用:

我们通常希望您的折扣表能够存储多个组的信息,例如产品。在这种情况下,我们可以写:

SELECT
    product,
    MAX(IIF(price BETWEEN FROM$ AND TO$, Discount, NULL)) AS Discount
FROM yourTable
GROUP BY
    product;

在您的示例中,无法找到9.999之类的值的折扣。。。它大于9.99,小于10,不适合您的任何范围。我首先将您的数据更改为:

| From | To   | Discount |
|------|------|----------|
| 0    | 10   | 0.05     |
| 10   | 20   | 0.10     |
| 20   | 50   | 0.12     |
| 50   | NULL | 0.13     |
然后你可以像这样探测这个表:

选择折扣 打折 其中@Value>=[From] 并且@Value<[To]或[To]为空
假设在这些范围内没有差距,我发现在许多数据库中,最有效的方法是:

select t.*,
       (select top 1 d.discount
        from discounts d
        where t.[$] <= d.[from$]  -- the $ is for whatever column name you actually use
        order by d.[from$] desc
       ) as discount
from t;
请注意,这会忽略到$


特别是,这应该能够利用折扣指数从$,折扣。

是否应该在t.[$]>=d.[从$]的位置?我将测试这些建议并报告。与此同时,我还发现了另一个例子,在这个例子中,你只需要存储一个范围的起始点,这个范围可能有意义,但我很难理解这个概念。我只是想知道这对任何人来说是否有意义。如果你使用“仅起点”的概念,那么你的“发件人”列将看起来像0、10、20、50,查询将是“选择前1位折扣”。。。其中@value>=[from]ORDER BY[from]DESC我认为MSACCESS支持TOP n子句以前从未使用过TOP函数。我去查一下,看看我能不能做到。我会回来报到。。。
select t.*,
       (select top 1 d.discount
        from discounts d
        where t.[$] <= d.[from$]  -- the $ is for whatever column name you actually use
        order by d.[from$] desc
       ) as discount
from t;