数据库表的使用简介 -
我正在开发基于“股市价格”的数据库表。我的表格中包含以下FIELDS的数据 -
ID
SYMBOL
OPEN
HIGH
LOW
CLOSE
VOLUME
音量变化
音量变化%
OPEN_INT
行业
TIMESTAMP
根据当天的股票市场价格变化,每天“周一至周五”将新数据添加到表格中。当前要求基于VOLUME
字段,该字段显示每日特定股票的交易量。
要求 - 分别获得过去10,15和30天的平均和总成交量。
当前使用的方法 - 我创建了这9个SEPARATE QUERIES以获得我想要的结果 - 首先,我创建了这3个查询,以从当前表中取出最近的最后10,15和30个日期:
qryLast10DaysStored
qryLast15DaysStored
qryLast30DaysStored
然后我创建了这3个查询来获取相应的AVERAGES:
qrySymbolAvgVolume10Days
qrySymbolAvgVolume15Days
qrySymbolAvgVolume30Days
然后我创建了这3个查询来获取相应的TOTALS:
qrySymbolTotalVolume10Days
qrySymbolTotalVolume15Days
qrySymbolTotalVolume30Days
面临当前方法的问题 - 现在,我的问题是我最终得到了这么多不同的查询,而我想把输出变成一个单一查询,,如Excel表格的快照所示:
http://i49.tinypic.com/256tgcp.png
需要解决方案 -
有什么方法可以将这些必填字段放入ONE SINGLE QUERY中,这样我就不必查看所需字段的多个位置了吗?有人可以告诉我如何将所有这些单独的查询合并为一个 -
A)将这些单独的个别查询的结果取出或移动到一个
B)或者通过创建一个新的查询来计算其自身内的所有这些字段,以便不再需要这些单独的单个查询。我认为这是一个更好的解决方案。
关于日期的一个澄清 - 有些朋友可能会想到为什么我使用Top 10,15和30的方法来获取最后10,15和30个日期值。为什么我只使用PC Date获取这些值?或使用像 -
这样的东西("VOLUME","tbl-B", "TimeStamp BETWEEN Date() - 10 AND Date()")
答案是我需要查询" Read"来自" TIMESTAMP"的日期现场,然后相应地执行其计算最后/最近" 10天,15天,30天“这些数据可以在表格中找到,而不是考虑当前日期是什么。它不应以任何方式取决于当前日期。
如果有更好的方法或更有效的方法来创建这些查询,那么请指教。
答案 0 :(得分:2)
您有单独的查询来计算10DayTotalVolume
和10DayAvgVolume
。我怀疑你可以在一个查询中计算, qry10DayVolumes 。
SELECT
b.SYMBOL,
Sum(b.VOLUME) AS 10DayTotalVolume,
Avg(b.VOLUME) AS 10DayAvgVolume
FROM
[tbl-B] AS b INNER JOIN
qryLast10DaysStored AS q
ON b.TIMESTAMP = q.TIMESTAMP
GROUP BY b.SYMBOL;
但是,这让我想知道10DayAvgVolume
是否可以是10DayTotalVolume / 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;
假设您已根据我为qry15DayVolumes
建议的方法创建了qry30DayVolumes
和qry10DayVolumes
。
如果要减少查询数量,可以使用每个qry??DayVolumes
已保存查询的子查询,但首先尝试这种方法以确保逻辑正确。
在上面的第二个查询中,由于字段名称以数字开头,可能会出现问题。将这些名称用方括号括起来,或者使用以字母而不是数字开头的别名来在qry10DayVolumes
,qry15DayVolumes
和qry30DayVolumes
中对它们进行重新别名。
我使用您上传的“ 2nd Upload.mdb ”测试了上面的查询,并且它从Access 2007运行时没有错误。以下是该查询的结果集的第一行:
SYMBOL 10DayTotalVolume 10DayAvgVolume 15DayTotalVolume 15DayAvgVolume 30DayTotalVolume 30DayAvgVolume
ACC-1 42909 4290.9 54892 3659.46666666667 89669 2988.96666666667
答案 1 :(得分:1)
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