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

时间:2013-09-17 15:53:14

标签: sql vb.net ms-access oledb

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

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

要手动计算,我需要在第四季度(12/31/2012)的最后一个营业日除以第四季度第一个营业日的开盘价(10/1 / 2012)。然后我需要减去1并乘以100以获得百分比。

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

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

我无法为SQL语句提供正确的语法,以便从原始历史价格表中创建增长率表。任何人都可以帮我解决SQL语句吗?

1 个答案:

答案 0 :(得分:1)

以下是我如何解决问题:

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

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

然后我在Access中创建另一个保存的查询,名为[Qtr_Dates],查找每个股票代码和季度的第一个和最后一个工作日:

SELECT 
    Stock_Price_with_qtr.Ticker, 
    Stock_Price_with_qtr.Yr, 
    Stock_Price_with_qtr.Qtr, 
    Min(Stock_Price_with_qtr.Date1) AS Qtr_Start, 
    Max(Stock_Price_with_qtr.Date1) AS Qtr_End
FROM Stock_Price_with_qtr
GROUP BY 
    Stock_Price_with_qtr.Ticker, 
    Stock_Price_with_qtr.Yr, 
    Stock_Price_with_qtr.Qtr

这将允许我在VB.NET(或C#或Access本身)中使用以下查询来计算季度增长率:

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)