2013-10-25 36 views
1

我有一個名爲Cash_Flow_Statements的數據庫,我需要創建一個保存的查詢來計算過去十二個月(TTM)的自由現金流量。使用MS Access數據庫追蹤十二個月公式

這裏是我的數據庫的一個例子:

Cash_Flow_Statement

這裏是我保存的查詢代碼。我已經使用這個代碼進行其他計算,所以我知道它的工作原理。我只是不知道如何在SQL中做一個十二個月的追蹤。

CREATE PROC " & Calculation & " AS _ 
SELECT Income_Statements.Ticker, Income_Statements.[Year], Income_Statements.Period, _ 
" & Formula & " AS TTM _ 
FROM (Income_Statements AS Income_Statements INNER JOIN Balance_Sheets AS Balance_Sheets ON (Income_Statements.Ticker = Balance_Sheets.Ticker) AND (Income_Statements.[Year] = Balance_Sheets.[Year]) AND (Income_Statements.Period = Balance_Sheets.Period)) _ 
INNER JOIN Cash_Flow_Statements AS Cash_Flow_Statements ON (Balance_Sheets.Ticker = Cash_Flow_Statements.Ticker) AND (Balance_Sheets.[Year] = Cash_Flow_Statements.[Year]) AND (Balance_Sheets.Period = Cash_Flow_Statements.Period) 

我需要的變量Formula遏制,將計算追蹤12個月的自由現金流方程。數學如下:

自由現金流量TTM =總和(運營現金流量MRQ1 +運營現金流量MRQ2 +運營現金流量MRQ3 +運營現金流量MRQ4) - 總和(資本支出MRQ1 +資本支出MRQ2 +資本支出MRQ3 +資本支出MRQ4)

MRQ =最近季度

我需要這個公式是SQL。我該怎麼做呢?

UPDATE

每@Gord湯普森的答案下面我想出了這個代碼:

SELECT Ticker, [Year], Period, (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 = s.Ticker AND su.[Year] = s.[Year] AND (su.Period Between s.Period - 3 And s.Period)) _ 
AS SalesLast12Months _ 
FROM Cash_Flow_Statements AS s 

當這本身運行它返回正是我需要的。但正如我在我原來的帖子中提到的,我需要能夠設置變量Formula以包含SQL語句,然後將其插入到現有的SQL語句中。

所以我試着去適應@湯普森的答案,我已經提出了這個問題。

公式:

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 = Cash_Flow_Statements.Ticker AND su.[Year] = Cash_Flow_Statements.[Year] AND (su.Period Between Cash_Flow_Statements.Period - 3 And Cash_Flow_Statements.Period))」 

SQL語句:

"CREATE PROC " & Calculation & " AS SELECT Income_Statements.Ticker, Income_Statements.[Year], Income_Statements.Period, " & Formula & " AS TTM _ 
FROM (Income_Statements AS Income_Statements _ 
INNER JOIN Balance_Sheets AS Balance_Sheets ON (Income_Statements.Ticker = Balance_Sheets.Ticker) AND (Income_Statements.[Year] = Balance_Sheets.[Year]) AND (Income_Statements.Period = Balance_Sheets.Period)) _ 
INNER JOIN Cash_Flow_Statements AS Cash_Flow_Statements ON (Balance_Sheets.Ticker = Cash_Flow_Statements.Ticker) AND (Balance_Sheets.[Year] = Cash_Flow_Statements.[Year]) AND (Balance_Sheets.Period = Cash_Flow_Statements.Period) 

這是結果:

enter image description here

再次,這是非常接近,但不是我需要相當的。我相信我知道是什麼原因導致代碼無法正常工作,但我不知道如何修復它。在@Gord Thompson代碼中,最後一行是FROM Cash_Flow_Statements AS s。當我將變量公式插入到原始帖子的現有SQL語句中時,代碼爲FROM (Income_Statements AS Income_Statements _ INNER JOIN Balance_Sheets AS Balance_Sheets ON (Income_Statements.Ticker = Balance_Sheets.Ticker) AND (Income_Statements.[Year] = Balance_Sheets.[Year]) AND (Income_Statements.Period = Balance_Sheets.Period)) _ INNER JOIN Cash_Flow_Statements AS Cash_Flow_Statements ON (Balance_Sheets.Ticker = Cash_Flow_Statements.Ticker) AND (Balance_Sheets.[Year] = Cash_Flow_Statements.[Year]) AND (Balance_Sheets.Period = Cash_Flow_Statements.Period)我幾乎肯定這是問題所在,但不知道如何糾正。

回答

0

變量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) 
+1

很高興看到你把它整理出來。 –

+0

@GordThompson如果沒有你的幫助,不可能完成它。謝謝! – gromit1

2

讓我們不要太擔心列,讓我們專注於選擇適當的行。

假設我們有一個名爲[SalesSummary]含

Item  FiscalYear Quarter TotalSales 
-------- ---------- ------- ---------- 
bicycles  2011  1   100 
bicycles  2011  2   200 
bicycles  2011  3   300 
bicycles  2011  4   400 
bicycles  2012  1   500 
bicycles  2012  2   600 
bicycles  2012  3   700 
bicycles  2012  4   800 
ham    2011  1   10 
ham    2011  2   20 
ham    2011  3   30 
ham    2011  4   40 
ham    2012  1   50 
ham    2012  2   60 
ham    2012  3   70 
ham    2012  4   80 

表如果我們想創建一個查詢,顯示該季度的數字與過去12個月的總銷量(當前季度以及之前的3沿我們可能會認爲我們不得不開始搞亂IIf()來處理從一個FiscalYear到另一個FiscalYear的「環繞」。幸運的是,我們不這樣做,因爲我們可以在下一個FiscalYear中複製具有「假」宿舍的相同數據:2011_Q(4)變爲2012_Q(0),2011_Q(3)變爲2012_Q(-1),等等。

SELECT 
     Item, 
     FiscalYear, 
     Quarter, 
     TotalSales 
    FROM SalesSummary 
UNION ALL 
    SELECT 
     Item, 
     FiscalYear + 1, 
     Quarter - 4, 
     TotalSales 
    FROM SalesSummary 

回報

Item  FiscalYear Quarter TotalSales 
-------- ---------- ------- ---------- 
bicycles  2011  1   100 
bicycles  2011  2   200 
bicycles  2011  3   300 
bicycles  2011  4   400 
bicycles  2012  1   500 
bicycles  2012  2   600 
bicycles  2012  3   700 
bicycles  2012  4   800 
ham    2011  1   10 
ham    2011  2   20 
ham    2011  3   30 
ham    2011  4   40 
ham    2012  1   50 
ham    2012  2   60 
ham    2012  3   70 
ham    2012  4   80 
bicycles  2012  -3   100 
bicycles  2012  -2   200 
bicycles  2012  -1   300 
bicycles  2012  0   400 
bicycles  2013  -3   500 
bicycles  2013  -2   600 
bicycles  2013  -1   700 
bicycles  2013  0   800 
ham    2012  -3   10 
ham    2012  -2   20 
ham    2012  -1   30 
ham    2012  0   40 
ham    2013  -3   50 
ham    2013  -2   60 
ham    2013  -1   70 
ham    2013  0   80 

如果我們保存了該查詢爲[SalesUnion]那麼我們就可以用它來生產我們總計像這樣

SELECT 
    Item, 
    FiscalYear, 
    Quarter, 
    TotalSales, 
    (
     SELECT 
      SUM(su.TotalSales) 
      FROM SalesUnion su 
      WHERE su.Item = s.Item 
       AND su.FiscalYear = s.FiscalYear 
       AND (su.Quarter Between s.Quarter - 3 And s.Quarter) 
    ) AS SalesLast12Months 
FROM SalesSummary s 

或者,如果你不想依靠已保存的查詢,您可以一次完成所有操作:

SELECT 
    Item, 
    FiscalYear, 
    Quarter, 
    TotalSales, 
    (
     SELECT 
      SUM(su.TotalSales) 
      FROM 
       (
         SELECT 
          Item, 
          FiscalYear, 
          Quarter, 
          TotalSales 
         FROM SalesSummary 
        UNION ALL 
         SELECT 
          Item, 
          FiscalYear + 1, 
          Quarter - 4, 
          TotalSales 
         FROM SalesSummary 
       ) su 
      WHERE su.Item = s.Item 
       AND su.FiscalYear = s.FiscalYear 
       AND (su.Quarter Between s.Quarter - 3 And s.Quarter) 
    ) AS SalesLast12Months 
FROM SalesSummary s 

無論哪種方式,結果是

Item  FiscalYear Quarter TotalSales SalesLast12Months 
-------- ---------- ------- ---------- ----------------- 
bicycles  2011  1   100    100 
bicycles  2011  2   200    300 
bicycles  2011  3   300    600 
bicycles  2011  4   400    1000 
bicycles  2012  1   500    1400 
bicycles  2012  2   600    1800 
bicycles  2012  3   700    2200 
bicycles  2012  4   800    2600 
ham    2011  1   10     10 
ham    2011  2   20     30 
ham    2011  3   30     60 
ham    2011  4   40    100 
ham    2012  1   50    140 
ham    2012  2   60    180 
ham    2012  3   70    220 
ham    2012  4   80    260 
+0

這是偉大的!當我修改你的答案以適合我的程序並獨立運行代碼時,它可以很好地工作。但是當我嘗試在原始文章中的代碼中使用它時,我遇到了一些麻煩。我原來的帖子中究竟會把變量'Formula'放到什麼位置? – gromit1

+0

我已更新我的原始帖子,以反映我根據您的答案所做的更改。 – gromit1