2009-03-06 6 views
3
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 

Dies ist der Code, den ich derzeit für einen gegebenen Monat ausgeben muss. Ich möchte dies erweitern, um die Summen pro Monat für die letzten 12 Monate abzurufen. Die Art, wie ich das sehe, wäre, den CurrentMonth-Wert rückwärts zu durchlaufen, und wenn CurrentMonth den Wert 0 erreicht, den Wert von CurrentYear zurückrollen 1. Mit der Loop-Variable (i) ein Array von 12 Werten aufbauen : MTotal()Aufbau einer monatlichen Gesamtsumme aus den letzten 12 Monaten

Was denkst du?

+0

Wie beschrieben, verwenden Sie nicht und müssen daher InvMonth und InvYear nicht auswählen, da Sie den Wert aus den Eingabedaten kennen. Sie sollten das DBMS auch dazu bringen, SUM (verbraucht) zu verwenden, sodass Sie für den angegebenen Monat eine Zeile erhalten. –

+0

(Sie können InvMonth und InvYear für Debugging-Zwecke aufbewahren, aber wenn Sie das tun, müssen Sie sie GRUPPIEREN, wenn Sie den SUM hinzufügen). –

Antwort

1

Eine Gruppe von sollte Sie auf dem Weg bekommen.

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 

Joshs DATEDIFF ist eine bessere Lösung als meine ursprünglichen TOP und ORDER BY

+0

Sie möchten wahrscheinlich nicht TOP 12 verwenden. Ein besserer Weg wäre, nach einem Datumsbereich zu suchen. Vermeiden Sie auch Dinge wie YEAR (Datum) = x. Dies verhindert, dass SQL Server Indizes für "Datum" verwendet. Berechnen Sie die frühesten und spätesten Daten und tun Sie etwas wie "Datum zwischen x und y" –

+0

Ich stimme zu. Die Abfrage wurde aktualisiert. –

0

Das einzige Problem dabei ist, dass ich eine monatliche Gesamt erfordern, für jedes der letzten 12 Monate eher dann der insgesamt für die letzten 12 Monate. Ansonsten sehe ich, wie die Verbesserung der SQL statt VB6-Code oculd wäre eine bessere Option.

+0

hmm mein Konto scheint gelöscht worden zu sein. Tut mir leid, dass ich mit einem Kommentar geantwortet habe. –

1

ich durch „Runden“ das Datum des Monats angehen würde dies, und dann von diesem Monat aktuelle Gruppierung, und in Höhe von insgesamt abgebrannte Menge:

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] 

Die [MonthDate] formatiert werden kann Monat anzuzeigen/Datum passend oder in getrennten Spalten.

Die WHERE-Klausel kann parametriert werden einen geeigneten Bereich von Datensätzen zur Verfügung zu stellen

+0

P.S. Bitte fragen Sie, wenn Sie möchten, ein Beispiel für die "Formatierung" Ich beziehe mich auf – Kristen

+0

+1, gute Lösung, habe ich dabei getan. Ich denke auch, du meintest "abschneiden", nicht "runden". – orip

0

enthalten sein Die Lösung kam ich mit wäre:

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 

Ich glaube, dies sollte wie erwartet funktionieren. Dennoch freue ich mich darauf, zu sehen, welche Lösungen Sie kommen können, oder wenn jemand ein Problem mit ym beheben kann.