【问题标题】:SQL Query to Retrieve Multiple Varients based on ranges of inputs and existing data基于输入范围和现有数据检索多个变量的 SQL 查询
【发布时间】:2019-07-01 13:00:35
【问题描述】:

我有一个数据集,我正在尝试查询以获取折扣率。挑战在于数据集仅对可能的查询输入的一个子集持有折扣。

在某些情况下,我可以从数据中获得准确的折扣率。在其他情况下,我需要获取最接近的匹配项(更高和更低),然后从返回的数据外部计算折扣。

考虑如下的虚拟数据集:

如果我有完全匹配,那么很容易计算出折扣。例如,Freq 为 5,Duration 或 2 Order Quantity 为 50,折扣为 0.10402。

但是,如果频率为 7,持续时间为 6,订单为 50,则我需要能够返回下一个最低和下一个最高匹配行,然后独立计算实际折扣。例如:想要检索以下内容:

下一个最低值(例如:频率 5)= 0.10402 下一个最高值(例如:频率 10)= 0.31048

最后,如果我的频率和持续时间都没有完全匹配,我需要 4 个结果来独立计算折扣!例如:

折扣率:

(Low/Low) 小于的最近频率和小于的最近持续时间

(低/高)小于的最近频率和大于的最近持续时间

(高/低)最近频率大于和最近持续时间小于

(高/高)最近的频率大于和最近的持续时间大于

所以我认为我需要一个查询,该查询将返回 1 到 4 行,具体取决于提供的输入以及它们与数据的匹配程度。具体来说:

如果 Freq 和 Duration 完全匹配,则为一行。

如果(比如说)Freq 完全匹配,则为两行。第一行是下一个最低持续时间的费率,第二行是下一个最高持续时间的费率。

如果没有完全匹配,则为四行,例如:

第一行)最近的较低频率和最近的较低持续时间

第二行)最近的较低频率和最近的较高持续时间

第三行)最近的较高频率和最近的较低持续时间

第 4 行)最近的较高频率和最近的较高持续时间

希望这有点道理!有人对如何编写可以实现相同的查询有任何建议吗?尝试了很多不同的方法,但很纠结!

谢谢!

这是一个示例查询,我今天可以运行它来获得完全匹配!

select Rate from RateTable
 where ProductId=34343
 and ProductVariationCode='G497'
 and ProductStatus=0
 and Frequency=23
 and Duration=4
 and 100 >= MinOrder
 and 100 < MinOrder

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    最简单的方法可能是union:

    select . . .   -- your logic combining the values
    from ((select top (1) t.*
           from t
           where frequency <= @frequency and duration <= @duration and
                 @order between minorder and maxorder
           order by frequency desc, duration desc
          ) union  -- on purpose to remove duplicates
          (select top (1) t.*
           from t
           where frequency >= @frequency and duration <= @duration and
                 @order between minorder and maxorder
           order by frequency asc, duration desc
          ) union  -- on purpose to remove duplicates
          (select top (1) t.*
           from t
           where frequency <= @frequency and duration >= @duration and
                 @order between minorder and maxorder
           order by frequency desc, duration asc
          ) union  -- on purpose to remove duplicates
          (select top (1) t.*
           from t
           where frequency >= @frequency and duration >= @duration and
                 @order between minorder and maxorder
           order by frequency asc, duration asc
          )
         ) t;
    

    【讨论】:

    • 感谢您的回复。恐怕我很难弄清楚如何将您提供的内容与我已经制作的“基本”查询相结合!如果所有内容都匹配,则以下查询(作为示例)将返回单个结果:从 RateTable 中选择 Rate,其中 Frequency=23 and Duration=4 and 100 >= MinOrder and 100
    • 不知道怎么修改我要整合你提供的东西!!
    • @Jablalr 。 . .订单的比较需要在子查询中进行。
    • 已编辑我的原始问题以提供我现在使用的 SQL 示例。显然,这仅在频率和持续时间完全匹配的情况下有效并返回结果。你能告诉我如何整合你提供的东西吗?请!
    • 等等!....想通了,现在明白了。这正是我一直在寻找的。谢谢一百万!
    猜你喜欢
    • 2018-12-27
    • 2015-05-03
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2016-12-01
    相关资源
    最近更新 更多