2012-01-18 20 views
1

我有一個表格,包含以下列:reportDate DATETIME和損失CURRENCY,當然還有ID列。我如何創建一個查詢,可以給我一個累計總數?

如何編寫一個查詢,該查詢將返回帶有虧損列總數的表格?每個日期將有多個條目,所以我認爲他們將需要使用Sum()爲每個日期。我知道這與DSum功能有關,但我仍然在這一點上輸了。它應該是這個樣子

Month Losses Cum 
----- ------ ----- 
Jan  $3,000 $3,000 
Feb  $2,000 $5,000 
Mar  $1,500 $6,500 

有,這不是具體的訪問將是我最有助於一個SQL語句,我想。但所有的解決方案都很感激謝謝您的幫助。

+0

的MS Access本身不支持查詢此功能。 [這是一個解釋如何實現的例子。](http://msaccess.blogspot.com/2006/01/how-to-create-running-totals-in-query.html)FWIW,Oracle提供了一種本地方式做總計; [這裏是一個例子](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1793764100346222947)。 –

回答

1

我在你的問題的編輯歷史記錄中發現了表和字段名,所以使用了th這個答案中的名字。您沒有提供record_matYields樣本數據,所以我創建了自己,並希望它是適合:

id reportDate gainOrLoss 
1 12/28/2011 $1,500.00 
2 12/29/2011 $500.00 
3 12/30/2011 $1,000.00 
4 1/2/2012  $10.00 
5 1/3/2012 $4,500.00 
6 1/4/2012 $900.00 

首先,我創建qryMonthlyLosses。下面是SQL和輸出:

SELECT 
    Year(reportDate) AS reportYear, 
    Month(reportDate) AS reportMonth, 
    Min(y.reportDate) AS MinOfreportDate, 
    Sum(y.gainOrLoss) AS SumOfgainOrLoss 
FROM record_matYields AS y 
GROUP BY 
    Year(reportDate), 
    Month(reportDate); 

reportYear reportMonth MinOfreportDate SumOfgainOrLoss 
     2011   12  12/28/2011  $3,000.00 
     2012   1  1/2/2012  $5,410.00 

我使用的第一查詢,以創建另一個,qryCumulativeLossesByMonth

SELECT 
    q.reportYear, 
    q.reportMonth, 
    q.MinOfreportDate, 
    q.SumOfgainOrLoss, 
    (
     SELECT 
     Sum(z.gainOrLoss) 
     FROM record_matYields AS z 
     WHERE z.reportDate < q.MinOfreportDate 
    ) AS PreviousGainOrLoss 
FROM qryMonthlyLosses AS q; 

reportYear reportMonth MinOfreportDate SumOfgainOrLoss PreviousGainOrLoss 
     2011   12  12/28/2011  $3,000.00 
     2012   1  1/2/2012  $5,410.00   $3,000.00 

最後,我使用qryCumulativeLossesByMonth如在查詢中的數據源,其將所述輸出以符合您的要求格式。

SELECT 
    q.reportYear, 
    MonthName(q.reportMonth) AS [Month], 
    q.SumOfgainOrLoss AS Losses, 
    q.SumOfgainOrLoss + 
     IIf(q.PreviousGainOrLoss Is Null,0,q.PreviousGainOrLoss) 
     AS Cum 
FROM qryCumulativeLossesByMonth AS q; 

reportYear Month Losses Cum 
     2011 December $3,000.00 $3,000.00 
     2012 January $5,410.00 $8,410.00 

你或許可以用子查詢而不是單獨的命名查詢來修改成單個查詢。我使用這種逐步的方法,因爲我希望這會更容易理解。

編輯:我用MonthName()函數返回了全名。如果您想要縮寫的月份名稱,請將True作爲第二個參數傳遞給該函數。無論這些應該工作:

MonthName(q.reportMonth, True) AS [Month] 
MonthName(q.reportMonth, -1) AS [Month] 
+0

這絕對奏效。有沒有辦法按周而不是按月來做? – Sinaesthetic

+0

沒關係,我想我得到它 – Sinaesthetic

1

本頁面看起來對你有好處:

http://support.microsoft.com/kb/290136

僅供參考,我寫了下面的T-SQL對SQL Server之前:

create table #a (key_col int, val int) 

insert into #a values (1, 10) 
insert into #a values (2, 10) 
insert into #a values (3, 30) 
insert into #a values (4, 10) 

select x.key_col,x.val,sum(y.val) as cumulated 
from #a x 
inner join #a y on 
x.key_col >= y.key_col 
group by x.key_col,x.val 
order by x.key_col,x.val 

drop table #a 

結果:

key_col  val   cumulated 
----------- ----------- ----------- 
      1   10   10 
      2   10   20 
      3   30   50 
      4   10   60 
+0

感謝您的鏈接。我自己也找到了這個,但我並不完全清楚DSum函數中發生了什麼。我敢肯定,標準可能只是在哪裏ID <= [ID],但我遇到問題工作在總和(gainOrLoss)部分,它沒有正確分組 – Sinaesthetic

0

這會爲你做它在一個SQL不使用臨時表

SELECT Format$([TranDate],"yyyy mm") AS mthYear, First(DSum("[GainOrLoss]","[Trans]","Format$([TranDate],'yyyy mm')='" & [mthYear] & "'")) AS ThisMonth, First(DSum("[GainOrLoss]","[Trans]","Format$([TranDate],'yyyy mm')<='" & [mthYear] & "'")) AS RunningTotal FROM trans GROUP BY Format$([TranDate],"yyyy mm"); 
+0

如果有多個行在同一日期我認爲它會計數的值不止一次 – ChrisPadgham

相關問題