我有各种商品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
...
最终结果是,我希望能够看到每个类别的平均价格如何随时间变化 - 例如:
具体而言,例如,水果的平均价格系列应按照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。平均价格仍然存在,但我尝试的任何查询都没有获得。
那么如何使用查询为图表构建数据?
答案 0 :(得分:1)
在我们开始解决方案之前的一句话:注意不要在字段名称中使用保留字。 Timestamp
是保留字。 Access将允许您以这种方式命名列,但稍后您可能会遇到奇怪的问题,特别是如果您将来迁移到另一个数据库或使用其他一些从Access数据库中获取数据的工具。
所以在这里,我将您的Timestamp
列重命名为DateTimeStamp
。
我认为您的要求在VBA而不是纯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