用于MS Access查询以计算季度增长率的SQL语句

用于MS Access查询以计算季度增长率的SQL语句,sql,vb.net,ms-access,oledb,Sql,Vb.net,Ms Access,Oledb,我在MS Access数据库中有一个名为“历史股票价格”的表。此表包含以下列:Ticker、Date1、Open1、High、Low、Close1、Volume、Adj_Close。行由每个工作日的每个股票代码的数据组成 我需要在我的VB.net程序中运行一个查询,该查询将在我的程序中返回一个表,该表显示列出的每个股票代码每年每个季度的增长率。因此,对于这个例子,我需要找到谷歌在2012年第四季度的增长率 为了手动计算,我需要取2012年12月31日第四季度最后一个营业日的收盘价除以2012年1

我在MS Access数据库中有一个名为“历史股票价格”的表。此表包含以下列:Ticker、Date1、Open1、High、Low、Close1、Volume、Adj_Close。行由每个工作日的每个股票代码的数据组成

我需要在我的VB.net程序中运行一个查询,该查询将在我的程序中返回一个表,该表显示列出的每个股票代码每年每个季度的增长率。因此,对于这个例子,我需要找到谷歌在2012年第四季度的增长率

为了手动计算,我需要取2012年12月31日第四季度最后一个营业日的收盘价除以2012年10月1日第四季度第一个营业日的开盘价。然后我需要减去1,再乘以100,得到一个百分比

实际计算结果如下:707.38/759.05-1*100=-6.807%

每个季度的第一天和最后一天可能因周末的不同而有所不同


我无法为SQL语句提供正确的语法来从原始历史价格表创建增长率表。有人能帮我处理SQL语句吗?

下面是我如何解决这个问题的方法:

首先,我将创建一个名为[Stock_Price_with_qtr]的已保存查询访问,用于计算每行的年度和季度:

SELECT 
    Historical_Stock_Prices.*, 
    Year([Date1]) AS Yr, 
    Switch(Month([Date1])<4,1,Month([Date1])<7,2,Month([Date1])<10,3,True,4) AS Qtr
FROM Historical_Stock_Prices
这将允许我在VB.NET或C中使用以下查询,或访问自身来计算季度增长率:

SELECT 
    Qtr_Dates.Ticker, 
    Qtr_Dates.Yr, 
    Qtr_Dates.Qtr, 
    (([Close_Prices]![Close1]/[Open_Prices]![Open1])-1)*100 AS Qtr_Growth
FROM 
    (
        Historical_Stock_Prices AS Open_Prices 
        INNER JOIN Qtr_Dates 
        ON (Open_Prices.Ticker = Qtr_Dates.Ticker) 
            AND (Open_Prices.Date1 = Qtr_Dates.Qtr_Start)
    ) 
    INNER JOIN 
    Historical_Stock_Prices AS Close_Prices 
    ON (Qtr_Dates.Ticker = Close_Prices.Ticker)
        AND (Qtr_Dates.Qtr_End = Close_Prices.Date1) 

以下是我将如何处理这个问题:

首先,我将创建一个名为[Stock_Price_with_qtr]的已保存查询访问,用于计算每行的年度和季度:

SELECT 
    Historical_Stock_Prices.*, 
    Year([Date1]) AS Yr, 
    Switch(Month([Date1])<4,1,Month([Date1])<7,2,Month([Date1])<10,3,True,4) AS Qtr
FROM Historical_Stock_Prices
这将允许我在VB.NET或C中使用以下查询,或访问自身来计算季度增长率:

SELECT 
    Qtr_Dates.Ticker, 
    Qtr_Dates.Yr, 
    Qtr_Dates.Qtr, 
    (([Close_Prices]![Close1]/[Open_Prices]![Open1])-1)*100 AS Qtr_Growth
FROM 
    (
        Historical_Stock_Prices AS Open_Prices 
        INNER JOIN Qtr_Dates 
        ON (Open_Prices.Ticker = Qtr_Dates.Ticker) 
            AND (Open_Prices.Date1 = Qtr_Dates.Qtr_Start)
    ) 
    INNER JOIN 
    Historical_Stock_Prices AS Close_Prices 
    ON (Qtr_Dates.Ticker = Close_Prices.Ticker)
        AND (Qtr_Dates.Qtr_End = Close_Prices.Date1) 

@nordeen1检查上一次查询是否有打字错误。我刚刚将我的答案中的最后一个查询复制并粘贴到Access 2010和C 2010 Express中,在每种情况下,查询都工作正常。@nordeen1您是否将前两个查询输入Access并使用上一个查询中引用的确切名称保存在Access中?@nordeen1 re:是否可以创建并保存前两个查询从我的程序中是的,您可以使用DDL从VB.NET应用程序在Access数据库中创建保存的查询。只需使用OleDbCommand对象执行CREATE VIEW Stock_Price_,其中_qtr为SELECT Historical_Stock_Prices.*…。@nordeen1您可以创建一个交叉表透视查询,以获取上一次查询的结果,并按照所述重新格式化它们。方法与我的答案类似。如果您需要这方面的帮助,请打开一个新问题。如果[Ticker]是一个备注字段,您必须将其更改为文本。@nordeen1检查您上次的查询是否有打字错误。我刚刚将我的答案中的最后一个查询复制并粘贴到Access 2010和C 2010 Express中,在每种情况下,查询都工作正常。@nordeen1您是否将前两个查询输入Access并使用上一个查询中引用的确切名称保存在Access中?@nordeen1 re:是否可以创建并保存前两个查询从我的程序中是的,您可以使用DDL从VB.NET应用程序在Access数据库中创建保存的查询。只需使用OleDbCommand对象执行CREATE VIEW Stock_Price_,其中_qtr为SELECT Historical_Stock_Prices.*…。@nordeen1您可以创建一个交叉表透视查询,以获取上一次查询的结果,并按照所述重新格式化它们。方法与我的答案类似。如果您需要这方面的帮助,请打开一个新问题。如果[Ticker]是备注字段,则必须将其更改为文本。