MS Access:单个查询中的平均值和总计算量

时间:2012-10-24 12:13:39

标签: database ms-access

数据库表的使用简介 -

我正在开发基于“股市价格”的数据库表。我的表格中包含以下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天“这些数据可以在表格中找到,而不是考虑当前日期是什么。它不应以任何方式取决于当前日期。

如果有更好的方法或更有效的方法来创建这些查询,那么请指教。

2 个答案:

答案 0 :(得分:2)

您有单独的查询来计算10DayTotalVolume10DayAvgVolume。我怀疑你可以在一个查询中计算, 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建议的方法创建了qry30DayVolumesqry10DayVolumes

如果要减少查询数量,可以使用每个qry??DayVolumes已保存查询的子查询,但首先尝试这种方法以确保逻辑正确。

在上面的第二个查询中,由于字段名称以数字开头,可能会出现问题。将这些名称用方括号括起来,或者使用以字母而不是数字开头的别名来在qry10DayVolumesqry15DayVolumesqry30DayVolumes中对它们进行重新别名。

我使用您上传的“ 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