我正在尝试MS Access SQL查询。我的数据结构如下 Rent Table
这个想法是我希望拆分表以使用[Year_Start]和[Month_Start]作为基础收集最近12个月的启动。所以我粗略的代码将是:
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE [Year_Start] = Max([Year_Start]) AND [Month_Start] = Max([Month_Start])
ORDER BY [Renter_Name];
随后,其他月份表将在概念上编码如下:
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE [Year_Start] = Max([Year_Start]) AND [Month_Start] = Max([Month_Start]) - 1
ORDER BY [Renter_Name];
然后将使用减号调整后续月份。
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE [Year_Start] = Max([Year_Start]) AND [Month_Start] = Max([Month_Start]) - 2
ORDER BY [Renter_Name];
我还考虑了[Month_Start] = Max([Month_Start])的情况 - x将为零(0)或负数,因此理论代码为:
SELECT [Renter_Name], [Amount]
FROM RentTable1
IF Max([Month_Start]) - X <= 0 THEN
WHERE [Year_Start] = Max([Year_Start]) - 1 AND [Month_Start] = Max([Month_Start]) - X
ELSE
WHERE [Year_Start] = Max([Year_Start]) AND [Month_Start] = Max([Month_Start]) - X
END IF
ORDER BY [Renter_Name];
*** X是从最近一个月和一年开始落后的月份。
显然,您看到我的SQL编码技能非常弱。请原谅我,因为我真的是初学者。因此,有一些其他标准编程,如If-Then-Else语句。
我希望有人可以建议纠正上述代码。
谢谢!感谢每个偶然发现这个问题的人。
编辑1:
只是澄清一下,这是预期的想法:
在示例中,最新的时段是2016年和4年。所以它应该为TABLE1选择它。
后续查询将从最近一个月开始减去一个月,因此结果应为2016年和3年。这将持续到2016年和1年。
当4 - 4发生等于0时,查询应该能够跳过这个不合逻辑的步骤并通过(2016 - 1)并使用(2016 - 1)的结果得到最大月份,即2015年和12。
答案 0 :(得分:1)
首先,我的建议是:处理日期时使用DATE数据类型。您可以将StartDate指定为2016-04-01,将EndDate指定为2017-04-31。更好的是:将EndDate指定为2017-05-01,并始终记住您需要使用&gt; =作为StartDate和&lt;对于EndDate。
现在,你的问题。您需要使用[DateSerial()][1]
函数将列转换为正确的日期,如下所示:
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE DateSerial([Year_Start], [Month_Start], 1) =
(SELECT Max(DateSerial([Year_Start], [Month_Start], 1) as dt FROM RentTable1)
ORDER BY [Renter_Name];
要获取上个月的详细信息,请使用DateAdd()
功能。以下是上个月的示例:
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE DateSerial([Year_Start], [Month_Start], 1) =
(SELECT DateAdd('m', -1, Max(DateSerial([Year_Start], [Month_Start], 1)) as dt FROM RentTable1)
ORDER BY [Renter_Name];
以下是获取X个月前详细信息的通用查询:
SELECT [Renter_Name], [Amount]
FROM RentTable1
WHERE DateSerial([Year_Start], [Month_Start], 1) =
(SELECT DateAdd('m', [X] * (-1), Max(DateSerial([Year_Start], [Month_Start], 1)) as dt FROM RentTable1)
ORDER BY [Renter_Name];