我如何创建一个查询,可以给我一个累计总数?
我有一个表格,包含以下列: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语句,我想。但所有的解决方案都很感激谢谢您的帮助。
我在你的问题的编辑历史记录中发现了表和字段名,所以使用了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]
这绝对奏效。有没有办法按周而不是按月来做? – Sinaesthetic
没关系,我想我得到它 – Sinaesthetic
本页面看起来对你有好处:
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
感谢您的链接。我自己也找到了这个,但我并不完全清楚DSum函数中发生了什么。我敢肯定,标准可能只是在哪里ID Sinaesthetic
这会为你做它在一个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");
如果有多个行在同一日期我认为它会计数的值不止一次 – ChrisPadgham
的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)。 –