2012-06-23 102 views
0

我正在使用Firebird 2.1。SQL查詢/存儲proc來計算每日平均每日總和

我可以使用一些幫助創建以下查詢或存儲過程。

我需要列出每筆小額現金交易總額的月平均值。

讓我解釋:

TABLE PettyCash(行ID,TDate,INOUT量)

  • 1 2012-01-01 0 5.000
  • 2 2012-01-01 1 3.000
  • 3 2012-01-05 0 4.000
  • 4 2012-01-23 1 2.000
  • 5 2012-02-20 1 5.000

的InOut = 0,如果它是一個進入的,的InOut = 1,如果它是一個傳出的交易

什麼查詢所要做的是計算平衡每一天在這個月中,總結金額,然後除以當月的天數。

如果某一天沒有交易,餘額保持不變。

因此,在今年1月,是這樣的:

  • 2012-01-01 2.000
  • 2012-01-02 2.000
  • 2012-01-03 2.000
  • ...
  • 2012-01-05 6.000

等等。

使問題複雜化的是始終從上一年開始的餘額(這加起來就是今年的餘額)。

我估計是這樣的:

SELECT SUM(IIF(INOUT = 0, AMOUNT, -AMOUNT)) 
FROM PETTYCASH 
WHERE TDATE < '2012-01-01'; 

結果查詢或存儲過程中應給予的開始日期和結束日期 - 開始日期始終是一年的第一天,結束日期可能是一年中的某一天,即:StartDate = 2012-01-01,EndDate = 2012-06-23

如果EndDate不是一個月的最後一天,則最近幾個月的平均值應該是除以最後一天,在這個例子中,6月應該除以23而不是30.

結果應該是這樣的: 月|每月平均每日金額

任何幫助將不勝感激!

謝謝

回答

1

你需要的是一個子查詢。內部子查詢每天計算總和,外部查詢計算平均值。

我不熟悉firebird的日期函數,但它確實具有「提取」功能。下面使用它來得到你想要的東西:

select yr, mon, avg(amt) 
from (SELECT extract(year from tdate) as yr, extract(month from tdate) as mon, 
      extract(day from tdate) as day, 
      SUM(IIF(INOUT = 0, AMOUNT, -AMOUNT)) as amt 
     FROM PETTYCASH 
     WHERE TDATE < '2012-01-01' 
     group by extract(year from tdate), extract(month from tdate), 
       extract(day from tdate) 
    ) t 
group by yr, mon 
order by yr, mon 
+0

嘿,感謝您的查詢,但我不認爲這正是我所需要的 - 我可能還沒有明確,但餘額每個月累積。因此,從去年結轉餘額,將新交易添加到該交易,然後在下個月將新交易添加到上個月的最終餘額中,等等...... – Steve

+1

在這種情況下,您需要一個累計和。您可以很容易地在Oracle或SQL Server 2012中執行此操作。您需要自行加入以獲取Firebird中的累積和。最簡單的可能是在應用程序級別完成總和。 –

+0

我決定編寫一個存儲過程。謝謝你的幫助。 – Steve