3

我目前在 MS Access 中有一个名为 Quarterly_Growth_Rates 的查询,它生成下表:

Ticker  Year    Qtr Qtr_Growth  
AAPL    2013    3   21.46  
AMZN    2013    3   12.59  
BBBY    2013    3   4.11  
GOOG    2013    3   0.04  
V       2013    3   5.13  
AAPL    2013    2   -10.27  
AMZN    2013    2   4.01  
BBBY    2013    2   10.98  
GOOG    2013    2   10.74  
V       2013    2   7.66  
AAPL    2013    1   -20.07  
AMZN    2013    1   4.07  
BBBY    2013    1   14  
GOOG    2013    1   10.39  
V       2013    1   10.17  

我需要在我的 VB.net 程序中创建一个 CrossTab Query 来生成这个表:

Ticker  2013-3  2013-2  2013-1  
AAPL    21.46   -10.27  -20.07  
AMZN    12.59   4.01    4.07  
BBBY    4.11    10.98   14  
GOOG    0.04    10.74   10.39  
V       5.13    7.66    10.17  

因此,现在该表显示列:Ticker、Year、Qtr 和 Qtr_Growth,每季度每行显示每一行代码的每一年。

我需要它来显示列 Ticker, 2013-1, 2012-4, 2012-3 并且每个代码只有一行。

到目前为止,我的程序中有这段代码:

Dim cmd4 As OleDbCommand = New OleDbCommand("SELECT Ticker FROM Quarterly_Growth_Rates GROUP BY Ticker PIVOT Qtr ", Nordeen_Investing_3.con)
cmd4.ExecuteNonQuery()

此 MS Access CrossTab 查询的正确 SQL 语句是什么?

4

1 回答 1

3

使用交叉表查询,因此您不需要在 Access SQL 中“硬连线” YearQtr值。

另外我认为从查询ExecuteNonQuery中检索数据的方法是错误的。SELECT但是,这是在这个任务的 VB.Net 方面,我只能帮助你使用 Access SQL。

我将来自您的查询源的示例数据存储在名为YourQuery的表中。

在 Access 2007 中,下面的第一个查询给了我这个结果集:

Ticker  2013-1  2013-2  2013-3
AAPL    -20.07  -10.27   21.46
AMZN      4.07    4.01   12.59
BBBY     14      10.98    4.11
GOOG     10.39   10.74    0.04
V        10.17    7.66    5.13

它与您请求的输出仅在列顺序上有所不同。如果您希望列按时间段降序排列,请使用第二个查询。

还要注意我的数据源是一个表,但你的是一个查询。我提到了这种差异,因为在构建交叉表时,可能有一种更直接的方法可以通过从查询的源表开始来获得所需的内容。

TRANSFORM First(y.Qtr_Growth) AS FirstOfQtr_Growth
SELECT y.Ticker
FROM YourQuery AS y
GROUP BY y.Ticker
PIVOT y.Year & '-' & y.Qtr;

TRANSFORM First(y.Qtr_Growth) AS FirstOfQtr_Growth
SELECT y.Ticker
FROM YourQuery AS y
GROUP BY y.Ticker
ORDER BY y.Year & '-' & y.Qtr DESC 
PIVOT y.Year & '-' & y.Qtr;
于 2013-09-25T20:15:09.507 回答