【问题标题】:Ms ACCESS: calculating past annual averages over varying date rangesMs ACCESS:计算不同日期范围内过去的年平均值
【发布时间】:2016-11-08 17:48:15
【问题描述】:

在Ms ACCESS的表格中,用户可以从列表中选择商品(如铜、镍等),从列表中选择商品价格日期。 然后应计算过去 12 个月的平均商品价格。

例如:用户选择铜作为商品,2010 年 2 月 1 日,02/01/2010。然后,我希望在以下时间段内计算平均价格:[02/01/2009 - 02/01/2010]。

我不确定如何以查询形式编写此内容。这是目前不完整的代码;

SELECT Avg(CommPrices.Price) AS Expr1, 
FROM CommPrices
WHERE (((CommPrices.Commodity)=[Forms]![Tool Should Cost]![List243]))
AND CommPrices.DateComm = [Forms]![Tool Should Cost]![List55];

List243 是用户可以选择的商品列表,list55 是用户可以选择的日期列表。所有数据均来自 CommPrices 表。

注意:DateComm 列中最早的日期是 01/01/2008。因此,如果用户选择一个日期,例如 2008 年 2 月 1 日,则无法计算 2008 年 2 月 1 日之前过去 12 个月的平均值。我确实希望代码仍然使用可用日期计算平均值。 (在示例中,它只是过去一个月的平均值)

第二个说明:DateComm 列仅包含每个月的第一天的每月日期(例如 01/01/2008、02/01/2008、03/01/2008)。 list55 中列出的日期可以指一个月中的不同日期(例如 03/16/2009),在这种情况下,我希望代码仍然使用最接近的商品日期来计算过去 12 个月的平均值。因此,如果用户选择日期 03/16/2009,我希望代码计算 03/01/2008 - 03/01/2009 的 12 个月平均值。

【问题讨论】:

  • 你要CommPrices.DateComm BETWEEN DateAdd('yyyy', -1, [Forms]![Tool Should Cost]![List55]) AND [Forms]![Tool Should Cost]![List55]
  • 作为对上述(正确) 答案的补充说明:我非常喜欢将模块, 与从不同位置获取数字的子例程一起使用,然后将这些数字用作查询的参数。维护直接包含 [Forms]:[Some_Form]![Control12345] 等引用的代码非常困难。 (不可避免地,someone 更改了 something, somewhere, 的名称,所有突然的事情都开始破裂,这可能是很难找到他们!)
  • @HansUp - 谢谢,这绝对有效。但是,在这种情况下它并不完全有效:用户选择日期 08/24/2015 - 本例中的代码计算从 09/01/2014 到 08/01/2015 的年平均值,而我希望它计算2014 年 8 月 1 日至 2015 年 8 月 1 日的年平均值。
  • 用户选择的日期是08/24/2015,但是这个日期并没有准确的列在商品日期列表中。因此,如果用户选择 08/24/2015,则与该日期最接近的商品价格日期是 08/01/2015。然后,我希望代码从 08/01/2014-08/01/2015 计算过去 12 个月的平均商品价格。上面的代码使用 08/24/2015 作为起点(负 12 - 最接近 09/01/2014)计算它,而它应该是 08/01/2015,即使用户选择了 08/24/2015。令人困惑的是,用户可以选择不完全在商品日期列中的不同日期。
  • “最近的日期”重要吗? BETWEEN 不会为你处理这种逻辑吗?

标签: sql ms-access


【解决方案1】:

对于“整数”月份,它将是:

SELECT 
    Avg(CommPrices.Price) AS AveragePrice, 
FROM 
    CommPrices
WHERE 
    CommPrices.Commodity=[Forms]![Tool Should Cost]![List243]
    AND 
    CommPrices.DateComm = BETWEEN
        DateSerial(Year([Forms]![Tool Should Cost]![List55]) - 1, Month([Forms]![Tool Should Cost]![List55]), 1)
        AND
        DateSerial(Year([Forms]![Tool Should Cost]![List55]), Month([Forms]![Tool Should Cost]![List55]), 1)

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2021-12-29
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多