Sql 从过去12个月开始每月累计

Sql 从过去12个月开始每月累计,sql,database,datetime,vb6,date,Sql,Database,Datetime,Vb6,Date,这是我目前必须建立的代码,用于计算给定月份的总花费。 我希望将此扩展以检索过去12个月每月的总数 我认为这样做的方法是向后循环CurrentMonth值,如果CurrentMonth值达到0,则将CurrentYear的值回滚1。使用循环变量(i)构建12个值的数组:MTotal() 你们觉得怎么样?一个小组应该能让你们上路 CurrentMonth = Month(CurrentDate) CurrentYear = Year(CurrentDate) SQL = "SELECT S

这是我目前必须建立的代码,用于计算给定月份的总花费。 我希望将此扩展以检索过去12个月每月的总数

我认为这样做的方法是向后循环CurrentMonth值,如果CurrentMonth值达到0,则将CurrentYear的值回滚1。使用循环变量(i)构建12个值的数组:MTotal()


你们觉得怎么样?

一个小组应该能让你们上路

CurrentMonth = Month(CurrentDate)
CurrentYear = Year(CurrentDate)

    SQL = "SELECT Spent, MONTH(Date) AS InvMonth, YEAR(Date) As InvYear FROM Invoices WHERE YEAR(Date) = '" & CurrentYear & "' AND MONTH(Date) = '" & CurrentMonth & "'"
    RecordSet.Open SQL, Connection, adOpenStatic, adLockOptimistic, adCmdText
    Do Until RecordSet.EOF
        MTotal(i) = MTotal(i) + RecordSet.Fields("Spent")
        RecordSet.MoveNext
    Loop
    RecordSet.Close
选择前12名
已用金额
,月份(日期)为月份
,年(日)为投资年
从…起
发票
分组
年(日)、月(日)
其中DATEDIFF(mm,Date,GETDATE(())<12


Josh的DATEDIFF比我原来的TOP and ORDER BY是一个更好的解决方案。唯一的问题是,我需要过去12个月的每月总数,而不是过去12个月的总数。否则,我认为改进SQL而不是使用vb6代码可能是一个更好的选择。

我会通过“舍入”来解决这个问题该月的日期,然后按该月的日期分组,并合计支出金额:

SELECT TOP 12
  SUM(Spent) AS Spent
  , MONTH(Date) AS InvMonth
  , YEAR(Date) AS InvYear
FROM
  Invoices
GROUP BY
  YEAR(Date), MONTH(Date)
WHERE DATEDIFF(mm, Date, GETDATE(()) < 12
选择SUM(spend)作为[totalspend],
DATEADD(月,DATEDIFF(月,0,[Date]),0)为[MonthDate]
从发票
其中[日期]>='20080301'
和[日期]<'20090301'
按日期分组添加(月,日期差(月,0,[日期]),0)
[月日]命令
[MonthDate]的格式可以适当地显示月份/日期,也可以在单独的列中显示


WHERE子句可以参数化,以提供要包括的适当记录范围

我提出的解决方案是:

 SELECT SUM(Spent) AS [TotalSpent],
        DATEADD(Month, DATEDIFF(Month, 0, [Date]), 0) AS [MonthDate]
 FROM   Invoices 
 WHERE      [Date] >= '20080301'
        AND [Date] <  '20090301'
 GROUP BY DATEADD(Month, DATEDIFF(Month, 0, [Date]), 0)
 ORDER BY [MonthDate]

我相信这应该会像预期的那样起作用。不过,我仍然希望看到你们能拿出什么解决方案,或者如果有人发现ym fix存在问题。

您可能不想使用前12名。更好的方法是检查日期范围。另外,避免使用诸如YEAR(date)=x之类的东西。这会阻止SQL Server在“date”上使用任何索引。计算最早和最晚的日期,并执行类似“x和y之间的日期”之类的操作。嗯,我的帐户似乎已被删除。很抱歉回答了一个评论。如前所述,您不使用,因此不需要选择InvMonth和InvYear,因为您从输入数据中知道值。您还应该让DBMS进行总和(已花费),因此,您在给定的月份中只得到一行。(您可能会保留InvMonth和InvYear以进行调试,但如果您这样做,则需要在添加总和时按它们分组。)P.S.请询问您是否想要一个我所指的+1“格式”示例,很好的解决方案,我最终这样做了。我还认为您的意思是“截断”,而不是“四舍五入”。
For i = 0 To 11
    If CurrentMonth = 0 Then
        CurrentMonth = 12
        CurrentYear = CurrentYear - 1
    End If

    SQL = "SELECT Spent, MONTH(Date) AS InvMonth, YEAR(Date) As InvYear FROM Invoices WHERE YEAR(Date) = '" & CurrentYear & "' AND MONTH(Date) = '" & CurrentMonth & "'"
    RecordSet.Open SQL, Connection, adOpenStatic, adLockOptimistic, adCmdText
    Do Until RecordSet.EOF
        MTotal(i) = MTotal(i) + RecordSet.Fields("Spent").Value
        RecordSet.MoveNext
    Loop
    RecordSet.Close

    CurrentMonth = CurrentMonth - 1
Next