Database MS Access:单个查询中的平均值和总计计算
正在使用的数据库表简介- 我正在开发一个基于“股票市场价格”的数据库表。我的表格已获得以下字段的数据- IDDatabase MS Access:单个查询中的平均值和总计计算,database,ms-access,Database,Ms Access,正在使用的数据库表简介- 我正在开发一个基于“股票市场价格”的数据库表。我的表格已获得以下字段的数据- ID 符号 打开 高 低 关闭 音量 音量变化 体积变化% 打开\u INT 扇区 时间戳 根据当天的股票市场价格变化,每日“周一至周五”将新数据添加到表格中。当前需求基于交易量字段,该字段显示特定股票每天的交易量 要求– 分别获得最近10、15和30天的平均和总体积 当前使用的方法- 为了得到我想要的结果,我创建了这9个单独的查询- 首先,我创建了这3个查询,从当前表中取出最近的最后10、1
符号
打开
高
低
关闭
音量
音量变化
体积变化%
打开\u INT
扇区
时间戳 根据当天的股票市场价格变化,每日“周一至周五”将新数据添加到表格中。当前需求基于
交易量
字段,该字段显示特定股票每天的交易量
要求–
分别获得最近10、15和30天的平均和总体积
当前使用的方法-
为了得到我想要的结果,我创建了这9个单独的查询-
首先,我创建了这3个查询,从当前表中取出最近的最后10、15和30个日期:
QRYLAST10天存储QRYLAST15天存储
QRYLAST30天存储 然后,我创建了以下3个查询,以获得各自的平均值: QRYSYMBOLAVGVolume10天
QRYSYMBOLAVGVolume15天
QRYSYMBOLAVGVolume30天 然后我创建了以下3个查询,以获取各自的总数: qrySYMBOL总体积10天
qrySYMBOL总体积15天
qrySYMBOL总体积30天 当前方法面临的问题- 现在,我的问题是,我最终得到了这么多不同的查询,而我希望将输出结果放到一个查询中,如Excel工作表的快照所示: 需要解决方案- 是否有某种方法可以将这些必填字段放到一个查询中,这样就不必在多个地方查找必填字段?有人能告诉我如何将所有这些单独的查询合并成一个-
A) 将这些单独查询的结果取出或移动到一个查询中。
B) 或通过创建一个新查询来计算其自身中的所有这些字段,从而不再需要这些单独的查询。我认为这是一个更好的解决方案。 关于日期的一项澄清– 一些朋友可能会想,为什么我使用前10、15和30的方法来获取最后10、15和30个日期值。为什么我不使用PC日期来获取这些值?或者用了类似的东西-
("VOLUME","tbl-B", "TimeStamp BETWEEN Date() - 10 AND Date()")
答案是,我需要我的查询从“TIMESTAMP”字段“读取”日期,然后对最后/最近一次执行相应的计算“10天、15天、30天”,数据可在表中找到,而不必考虑当前日期。它不应以任何方式依赖于当前日期。
如果有更好的方法或更有效的方法来创建这些查询,请提供帮助。您有单独的查询来计算
10DayTotalVolume
和10DayAvgVolume
。我想您可以在一个查询中计算这两个数据,即qry10DayVolumes
然而,这让我怀疑10DayAvgVolume
是否可以是除10daydottalvolume/10
类似的考虑也适用于15天和30天的值
最终,我想你想要的是这样一个起点:
SELECT
q10.SYMBOL,
q10.[10DayTotalVolume],
q10.[10DayAvgVolume],
q15.[15DayTotalVolume],
q15.[15DayAvgVolume],
q30.[30DayTotalVolume],
q30.[30DayAvgVolume]
FROM
(qry10DayVolumes AS q10
INNER JOIN qry15DayVolumes AS q15
ON q10.SYMBOL = q15.SYMBOL)
INNER JOIN qry30DayVolumes AS q30
ON q10.SYMBOL = q30.SYMBOL;
假设您已经按照我为qry10daycolumes
建议的方法创建了qry15daycolumes
和qry30daycolumes
如果要减少查询数量,可以对每个qry??DayVolumes
已保存的查询使用子查询,但请先尝试这种方法以确保逻辑正确
在上面的第二个查询中,由于字段名以数字开头,可能会出现问题。将这些名称括在方括号内,或使用以字母而不是数字开头的别名在qry10daycolumes
、qry15daycolumes
和qry30daycolumes
中重新命名
我使用您上传的“2nd Upload.mdb”测试了上面所写的查询,它在Access 2007中运行时没有错误。以下是该查询结果集的第一行:
SYMBOL 10DayTotalVolume 10DayAvgVolume 15DayTotalVolume 15DayAvgVolume 30DayTotalVolume 30DayAvgVolume
ACC-1 42909 4290.9 54892 3659.46666666667 89669 2988.96666666667
Access不支持最高级的SQL语法和子句,因此这有点像黑客攻击,但它可以工作,并且在您的小样本上速度很快。您基本上运行了3个查询,但Union子句允许您组合成一个查询:
select
Symbol,
sum([10DayTotalVol]) as 10DayTotalV,
sum([10DayAvgVol]) as 10DayAvgV,
sum([15DayTotalVol]) as 15DayTotalV,
sum([15DayAvgVol]) as 15DayAvgV,
sum([30DayTotalVol]) as 30DayTotalV,
sum([30DayAvgVol]) as 30DayAvgV
from (
select
Symbol,
sum(volume) as 10DayTotalVol, avg(volume) as 10DayAvgVol,
0 as 15DayTotalVol, 0 as 15DayAvgVol,
0 as 30DayTotalVol, 0 as 30DayAvgVol
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 10 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
UNION
select
Symbol,
0, 0,
sum(volume), avg(volume),
0, 0
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 15 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
UNION
select
Symbol,
0, 0,
0, 0,
sum(volume), avg(volume)
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 30 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
) s
group by
Symbol
我不明白日期部分。如果您完成了Top(10)并按日期字段执行了订单。这样行吗?您将获得最后10天您必须根据列表中的最后10、15、30天进行计算的日期?datediff可能超过10、15和30?每个符号的最后几天呢?我也尝试了其他解决方案,但我认为你做得再好不过了……我想让所有东西都适合一个查询,使用DSUM是可能的,但它远不是SQL标准,它看起来很糟糕,而且速度很慢@谢谢你的好主意。现在,我觉得很有趣,为什么我自己没有早些时候想到在同一个查询中计算平均值和合计值,而不是分别计算!是的,你说得对。上面的代码现在运行良好。它正确地显示了所需的字段。非常感谢你的帮助。这段代码真是太棒了!!只需一个查询即可获得所有必需的字段,无需再处理多个查询。这个盒子里的东西很好。你的方法很好,非常感谢
select
Symbol,
sum([10DayTotalVol]) as 10DayTotalV,
sum([10DayAvgVol]) as 10DayAvgV,
sum([15DayTotalVol]) as 15DayTotalV,
sum([15DayAvgVol]) as 15DayAvgV,
sum([30DayTotalVol]) as 30DayTotalV,
sum([30DayAvgVol]) as 30DayAvgV
from (
select
Symbol,
sum(volume) as 10DayTotalVol, avg(volume) as 10DayAvgVol,
0 as 15DayTotalVol, 0 as 15DayAvgVol,
0 as 30DayTotalVol, 0 as 30DayAvgVol
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 10 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
UNION
select
Symbol,
0, 0,
sum(volume), avg(volume),
0, 0
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 15 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
UNION
select
Symbol,
0, 0,
0, 0,
sum(volume), avg(volume)
from
[tbl-b]
where
timestamp >= (select min(ts) from (select distinct top 30 timestamp as ts from [tbl-b] order by timestamp desc ))
group by
Symbol
) s
group by
Symbol