我的数据库中有两个已保存的查询,名为Free_Cash_Flow
和Quarterly_Growth_Rates
。它们显示在这里:
Free_Cash_Flow
:
Quarterly_Growth_Rates
:
当我使用此代码时:
SELECT * _
FROM Free_Cash_Flow AS C _
INNER JOIN Quarterly_Growth_Rates AS G _
ON (C.Ticker = G.Ticker) AND ((IIF(C.Period = 4, C.Year + 1, C.Year)) = G.Year) AND ((IIF(C.Period = 4, 1, C.Period + 1)) = G.Qtr)
返回:
列Free_Cash_Flow
为空。但正如您在Free_Cash_Flow
表中看到的那样,该列中有数据。为什么不被拉进新桌子?我使用类似格式的其他表运行此查询,一切都很好。有什么建议吗?
其他信息
我想补充说,Free_Cash_Flow列是使用其各自保存的查询的SQL语句中的公式填充的。我想这可能与我的问题有关。我真的被困在这里,我迫切需要解决这个问题。
以下是包含用于Free_Cash_Flow保存查询的SQL语句的代码:
变量:
Dim Calculation = “Free_Cash_Flow”
Dim Formula = “(SELECT (SUM(su.Net_Cash_Flow_Operating) - SUM(su.Capital_Expenditures)) _
FROM (SELECT Ticker, [Year], Period, Net_Cash_Flow_Operating, Capital_Expenditures _
FROM Cash_Flow_Statements UNION ALL SELECT Ticker, [Year] + 1, Period - 4, Net_Cash_Flow_Operating, Capital_Expenditures _
FROM Cash_Flow_Statements) su _
WHERE su.Ticker = c.Ticker AND su.[Year] = c.[Year] AND (su.Period Between c.Period - 3 And c.Period))”
Dim Where_Statement = "WHERE i.Period < 5"
SQL语句:
"CREATE PROC " & Calculation & " AS SELECT i.Ticker, i.[Year], i.Period, " & Formula & " AS " & Calculation & " _
FROM (Income_Statements AS i _
INNER JOIN Balance_Sheets AS b _
ON (i.Ticker = b.Ticker) AND (i.[Year] = b.[Year]) AND (i.Period = b.Period)) _
INNER JOIN Cash_Flow_Statements AS c ON (b.Ticker = c.Ticker) AND (b.[Year] = c.[Year]) AND (b.Period = c.Period) " & Where_Statement & ""
答案 0 :(得分:1)
不要特别知道原因,但使用“*”通常不是首选,但如果您明确查询指定的列,则可能有更好/正确的答案,例如
select
C.Ticker,
C.Year,
C.Period,
C.Free_Cash_Flow,
G.Year as GrowthYear,
G.Period as GrowthPeriod
from ....
可能会感到困惑,因为表名与列相同并忽略它。通过分别用“C”和“G”别名限定列,可能会做你想要的。
答案 1 :(得分:1)
这可能与您的JOIN无关。我想知道Free_Cash_Flow
是否属于OLEDB不理解的类型。看起来它在Open Office中作为货币价值,对吧?你知道OLEDB可以看到这个价值的事实吗?尝试更简单的查询,如
SELECT C.Free_Cash_Flow FROM Free_Cash_Flow AS C
并查看是否会出现任何问题。
答案 2 :(得分:1)
您是否尝试将最后一部分更改为WHERE并查看返回的内容?
WHERE ((IIF(C.Period = 4, C.Year + 1, C.Year)) = G.Year) AND
((IIF(C.Period = 4, 1, C.Period + 1)) = G.Qtr)
答案 3 :(得分:1)
您需要指定重命名时所需的列,如C&amp; G下面:
SELECT C.*, G.* _
FROM Free_Cash_Flow AS C _
INNER JOIN Quarterly_Growth_Rates AS G _
ON (C.Ticker = G.Ticker) AND ((IIF(C.Period = 4, C.Year + 1, C.Year)) = G.Year) AND ((IIF(C.Period = 4, 1, C.Period + 1)) = G.Qtr)
答案 4 :(得分:1)
理论上,没有理由不这样做,除了列名与表名相同这一事实。也许您的数据库引擎对此感到困惑,请尝试重命名。
答案 5 :(得分:1)
尝试替换下面的表名,并检查如果该列也没有出现,则Quarterly_Growth_Rates列是否即将到来,那么它可能是名称相同的问题。
SELECT * _ FROM Quarterly_Growth_Rates AS G _ INNER JOIN Free_Cash_Flow AS C _ON(G.Ticker = C.Ticker)AND(G.Year =(IIF(C.Period = 4,C.Year + 1,C.Year)))AND(G .Qtr =(IIF(C.Period = 4,1,C.Period + 1)))