Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database MS Access:单个查询中的平均值和总计计算_Database_Ms Access - Fatal编程技术网

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

Database MS Access:单个查询中的平均值和总计计算,database,ms-access,Database,Ms Access,正在使用的数据库表简介- 我正在开发一个基于“股票市场价格”的数据库表。我的表格已获得以下字段的数据- ID 符号 打开 高 低 关闭 音量 音量变化 体积变化% 打开\u INT 扇区 时间戳 根据当天的股票市场价格变化,每日“周一至周五”将新数据添加到表格中。当前需求基于交易量字段,该字段显示特定股票每天的交易量 要求– 分别获得最近10、15和30天的平均和总体积 当前使用的方法- 为了得到我想要的结果,我创建了这9个单独的查询- 首先,我创建了这3个查询,从当前表中取出最近的最后10、1

正在使用的数据库表简介-

我正在开发一个基于“股票市场价格”的数据库表。我的表格已获得以下字段的数据-

ID
符号
打开


关闭
音量
音量变化
体积变化%
打开\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