【问题标题】:If Then Else in WHERE clause in MS Access SQL QueryMS Access SQL 查询中的 WHERE 子句中的 If Then Else
【发布时间】:2016-06-29 01:52:39
【问题描述】:

我正在试用 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.

【问题讨论】:

  • 您的查询在概念上看起来是正确的,但您是否尝试过任何方法?
  • 我尝试了 iif,但出现了几个错误。尝试将片段括在括号中。另外,如果您注意到最后一个代码(以及所有其他代码),我使用了最大“年”和最大“月”,所以我猜为什么什么都没有出现,因为它认为“2016”和“12”是没有记录的月份找到而不是“2016”和“4”,这是我打算最新的,并且将从那里提取倒退十二个月的每个月 - 例如2016 & 4 = TABLE1, 2016 & (4 -1) = TABLE2, 2016 & (4 - 2) = TABLE 3 .... 如果 (4 - 4) 发生,它将执行 (2016 - 1) & max of year 2015 年 12 月。
  • IIf ( expr , truepart , falsepart )

标签: sql ms-access


【解决方案1】:

首先,我的建议是:处理日期时使用 DATE 数据类型。您可以将 StartDate 指定为 2016-04-01,将 EndDate 指定为 2017-04-31。更好的是:将 EndDate 指定为 2017-05-01,并始终记住您需要使用 >= 表示 StartDate 并使用

现在,解决您的问题。您需要使用[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];

【讨论】:

  • 工作就像一个魅力!非常感谢。正是我需要的。下一次,我应该运行具有固定日期的原始表,而不是以年、月等为单位的碎片日期。太糟糕了,原来的数据库是这样制作的。
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多