【问题标题】:SQL Statement for MS Access Query to Calculate Quarterly Growth RateMS Access Query 计算季度增长率的 SQL 语句
【发布时间】:2013-09-17 15:53:13
【问题描述】:

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

我需要从我的 VB.net 程序内部运行一个查询,该查询将在我的程序中返回一个表格,其中显示列出的每个股票代码每年每个季度的增长率。所以对于这个例子,我需要找到 2012 年第四季度 GOOG 的增长率。​​p>

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

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

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

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

【问题讨论】:

    标签: sql vb.net ms-access oledb


    【解决方案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) 
    

    【讨论】:

    • @nordeen1 检查您上次查询的拼写错误。我刚刚将答案中的最后一个查询复制并粘贴到 Access 2010 和 C# 2010 Express 中,并且在每种情况下查询都运行良好。
    • @nordeen1 您是否将前两个查询输入 Access 并在 Access 中保存它们(使用上一个查询中引用的确切名称)?
    • @nordeen1 回复:“是否可以在我的程序中创建并保存前两个查询?” - 是的,您可以使用 DDL 从您的 VB.NET 应用程序在 Access 数据库中创建保存的查询。只需使用OleDbCommand 对象来执行CREATE VIEW Stock_Price_with_qtr AS SELECT Historical_Stock_Prices.*, ...
    • @nordeen1 您可以创建一个交叉表 (PIVOT) 查询来获取最后一个查询的结果并按照您的描述重新格式化它们。该方法类似于我的回答here。如果您需要帮助,请打开一个新问题。
    • 如果 [Ticker] 是 Memo 字段,则必须将其更改为 Text
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多