我在MS Access数据库中有一个名为“Historical_Stock_Prices”的表。此表包含以下列:Ticker,Date1,Open1,High,Low,Close1,Volume,Adj_Close。行包含每个工作日的每个股票代码的数据。
我需要从我的VB.net程序中运行一个查询,该查询将在我的程序中返回一个表格,该表格显示每个列表中每个股票代码符号的每个季度的增长率。因此,对于这个例子,我需要在2012年第四季度找到GOOG的增长率。 p>
要手动计算,我需要在第四季度(12/31/2012)的最后一个营业日除以第四季度第一个营业日的开盘价(10/1 / 2012)。然后我需要减去1并乘以100以获得百分比。
实际计算如下:((707.38 / 759.05)-1)* 100 = -6.807%
每个季度的第一天和最后一天可能因周末而有所不同。
我无法为SQL语句提供正确的语法,以便从原始历史价格表中创建增长率表。任何人都可以帮我解决SQL语句吗?
答案 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)