如何使用MS-Access 2007查询从价格变化构建价格时间序列?

时间:2013-08-02 16:45:41

标签: ms-access

背景

我有各种商品tblPriceChanges的价格更改 tblItems的表格(以下示例 - 数据组成):

[tblPriceChanges]:
Timestamp       Item    Price
9AM 01/01/2013  Orange  50p
9AM 01/01/2013  Apple   30p
2PM 01/01/2013  Pen     80p
2PM 02/01/2013  Orange  55p
2PM 02/01/2013  Pen     85p
9AM 03/01/2013  Apple   25p
9AM 05/01/2013  Pencil  10p
9AM 05/01/2013  Pen     70p
2PM 05/01/2013  Pencil  15p    <- Notice there can be multiple price changes on the same day
...

[tblItems]:
Item    Category    Ratio
Orange  Fruit       1
Apple   Fruit       3
Pen     Stationary  2
Pencil  Stationary  5
...

问题

最终结果是,我希望能够看到每个类别的平均价格如何随时间变化 - 例如:

enter image description here

具体而言,例如,水果的平均价格系列应按照Ratio 1:3的橙色和苹果价格的加权平均值计算。所以最后我想为图表的基础数据生成(通过一些查询组合)下表:

Timestamp   Fruit   Stationary
01/01/2013  40.0    80.0
02/01/2013  55.0    85.0
03/01/2013  50.0    85.0
04/01/2013  50.0    85.0
05/01/2013  50.0    75.0
...
(this data is also made up and so probably not consistent with the original example)

我设法在两个表上获得内部联接,但不太确定如何继续。我的主要问题是如何处理没有价格变化的日子,例如01/04/13。平均价格仍然存在,但我尝试的任何查询都没有获得。

那么如何使用查询为图表构建数据?

1 个答案:

答案 0 :(得分:1)

在我们开始解决方案之前的一句话:注意不要在字段名称中使用保留字。 Timestamp是保留字。 Access将允许您以这种方式命名列,但稍后您可能会遇到奇怪的问题,特别是如果您将来迁移到另一个数据库或使用其他一些从Access数据库中获取数据的工具。

所以在这里,我将您的Timestamp列重命名为DateTimeStamp

我认为您的要求在VBA而不是纯SQL查询中更直接实现:虽然您可以轻松地构建一个查询来获取每天每个类别的平均值,但您将很难填写没有数据的日子的数据。

简单但不完整的SQL解决方案

然而,可能在您的数据中存在这些漏洞并不是一个大问题,因为图表只会跳过那些缺失的值(它们不会显示为0.00的数据值)。 在这种情况下,以下查询应该为您提供结果:

SELECT Dateserial(Year([DateTimeStamp]), 
                  Month([DateTimeStamp]), 
                  Day([DateTimeStamp])) AS NormalisedDate,
       tblItems.Category,
       SUM([Price]*[Ratio])/SUM([Ratio]) AS AvgPrice
FROM   tblPriceChanges
       INNER JOIN tblItems
         ON tblPriceChanges.Item=tblItems.Item
GROUP  BY Dateserial(Year([DateTimeStamp]), 
                     Month([DateTimeStamp]), 
                     Day([DateTimeStamp])),
          tblItems.Category 

会产生以下结果:

NormalisedDate    Category     AvgPrice
01/01/2013        Fruit        35
01/01/2013        Stationary   80
02/01/2013        Fruit        55
02/01/2013        Stationary   85
03/01/2013        Fruit        25
05/01/2013        Stationary   22.0833333333333