【问题标题】:Building up a monthly total from past 12 months建立过去 12 个月的每月总数
【发布时间】:2010-10-11 18:37:01
【问题描述】:
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 个月的每月总数。

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

你们觉得呢?

【问题讨论】:

  • 正如所写,您不使用因此不需要选择 InvMonth 和 InvYear,因为您知道输入数据的值。您还应该让 DBMS 进行 SUM(Spent),因此您最终会得到给定月份的一行。
  • (您可能会保留 InvMonth 和 InvYear 以进行调试,但如果这样做,则需要在添加 SUM 时对它们进行 GROUP BY)。

标签: sql database datetime vb6 date


【解决方案1】:

A group by 应该会让你上路。

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

Josh 的 DATEDIFF 是比我原来的 TOP 和 ORDER BY 更好的解决方案

【讨论】:

  • 您可能不想使用 TOP 12。更好的方法是检查日期范围。另外,避免像 YEAR(date) = x 这样的事情。这会阻止 SQL Server 在“日期”上使用任何索引。计算最早和最晚的日期并执行“date BETWEEN x AND y”之类的操作
【解决方案2】:

我会通过将日期“四舍五入”到月份来解决这个问题,然后按该月份日期分组,并总计花费金额:

 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]

[MonthDate] 可以格式化为适当地显示月份/日期,或在单独的列中显示。

可以对 WHERE 子句进行参数化以提供合适的记录范围

【讨论】:

  • P.S.请询问您是否想要我提到的“格式”示例
  • +1,很好的解决方案,我最终这样做了。我还认为您的意思是“截断”,而不是“舍入”。
【解决方案3】:

唯一的问题是我需要过去 12 个月的每个月的总计,而不是过去 12 个月的总计。否则,我会看到改进 SQL 而不是使用 vb6 代码是一个更好的选择。

【讨论】:

  • 嗯,我的帐户似乎已被删除。很抱歉用评论回答。
【解决方案4】:

我想出的解决方案是:

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

我相信这应该会按预期工作。不过,我仍然期待看到你们能提出什么解决方案,或者是否有人发现 ym fix 存在问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多