我有一个奇怪的查询。我正在创建一个汽车维修数据库。每辆车在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周期)。
答案 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,则可以使用它代替变量。