访问查询以查找下一个维护周期

时间:2016-10-28 23:21:50

标签: sql ms-access

我有一个奇怪的查询。我正在创建一个汽车维修数据库。每辆车在250,500,1000和2000处有不同的维护周期。因此,当用户上车并输入里程时,需要知道下一个维护周期是什么。

这是一个例子。所以车辆将有1150英里,下一个周期将是1250.我有一张表说有250,500,1000和2000个周期,但我没有1250或1500或1750的任何东西因为它们是相同的因为它需要选择250维护周期然后超过1250,它需要显示1500是下一个周期,依此类推。

那么我该怎样做才能选择下一个维护周期?

以下是一些数据:

250 Cycle
500 Cycle
1000 Cycle
2000 Cycle

用户在850个周期内上车,如何在这种情况下选择1000但是如果用户使用1050车辆上车,则需要选择250个周期(因为没有1250周期)。

3 个答案:

答案 0 :(得分:2)

在Access中,创建函数要简单得多:

Public Function NextCycle(ByVal Mileage As Long) As Long

    Dim rst         As DAO.Recordset

    Dim SQL         As String
    Dim Cycle       As Long
    Dim ThisCycle   As Long
    Dim NextService As Long

    SQL = "Select Cycle From Cycles Order By 1"
    Set rst = CurrentDb.OpenRecordset(SQL)

    Cycle = rst!Cycle.Value
    While Not rst.EOF
        ThisCycle = rst!Cycle.Value
        NextService = -Int(-Mileage / ThisCycle) * ThisCycle
        If NextService - Mileage < Cycle Then
            Cycle = ThisCycle
        End If
        Debug.Print Mileage, ThisCycle, NextService, NextService - Mileage, Cycle
        rst.MoveNext
    Wend
    rst.Close

    Set rst = Nothing

    NextCycle = Cycle

End Function

示例结果:

? NextCycle(850)
 850           250           1000          150           250 
 850           500           1000          150           500 
 850           1000          1000          150           1000 
 850           2000          2000          1150          1000 
 1000 

? NextCycle(1050)
 1050          250           1250          200           250 
 1050          500           1500          450           250 
 1050          1000          2000          950           250 
 1050          2000          2000          950           250 
 250 

? NextCycle(10850)
 10850         250           11000         150           250 
 10850         500           11000         150           500 
 10850         1000          11000         150           1000 
 10850         2000          12000         1150          1000 
 1000 

答案 1 :(得分:0)

这样的事情应该有效。这是在SQL中。如果您使用MS Access,则必须翻译,因为我没有MS Access。此示例创建并填充临时表变量。然后它得到当前周期数和下一个更大周期之间的差异。然后在case语句中,它使用差异从temp表中选择下一个较小的循环。如果没有可用的较小循环,则返回大于当前循环值的下一个循环。

请注意,我还没有完成处理环绕的工作,当前周期大于表中的最大值。

DECLARE @CurrCycle int = 749

DECLARE @Temp TABLE
(
    Cycle int
)

INSERT INTO @Temp VALUES (250)
INSERT INTO @Temp VALUES (500)
INSERT INTO @Temp VALUES (1000)
INSERT INTO @Temp VALUES (2000)

DECLARE @Difference int

SET @Difference = 
(
    SELECT 
        TOP 1 (Temp1.Cycle - @CurrCycle)
    FROM
        @Temp Temp1
    WHERE
        (Temp1.Cycle >= @CurrCycle)
)

SELECT (CASE
    WHEN
        (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle <= @Difference) IS NOT NULL THEN (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle <= @Difference ORDER BY Cycle DESC)
    ELSE
        (SELECT TOP 1 Cycle FROM @Temp WHERE Cycle >= @CurrCycle)
END)

答案 2 :(得分:0)

 [cycle]*(1+Int([miles]/[cycle]))

这将给出下一个周期,假设它们均匀发生。如果循环始终为250,则可以使用它代替变量。