2009-03-06 2 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 

Это код, который я сейчас должен собрать, потратить на определенный месяц. Я хочу расширить это, чтобы получить итоговые данные за месяц, в течение последних 12 месяцев.Создание ежемесячной общей суммы за последние 12 месяцев

То, как я это делаю, будет состоять в том, чтобы прокрутить назад значение CurrentMonth, и если значение CurrentMonth достигнет 0, сверните значение CurrentYear назад 1. Используя переменную цикла (i), чтобы создать массив из 12 значений : MTotal()

Что вы, ребята, думаете?

+0

Как указано, вы не используете и, следовательно, не нужно выбирать InvMonth и InvYear, так как вы знаете значение из входных данных. Вы также должны получить СУБД для выполнения SUM (потрачено), поэтому вы получите одну строку за данный месяц. –

+0

(Вы можете оставить InvMonth и InvYear для целей отладки, но если вы это сделаете, вам понадобится ГРУППА BY при добавлении СУММЫ). –

ответ

1

Группа должна получить вас в пути. DATEDIFF

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 

Джоша является лучшим решением, чем мой первоначальный TOP и ORDER BY

+0

Вы, вероятно, не хотите использовать TOP 12. Лучшим способом было бы проверить диапазон дат. Кроме того, избегайте таких вещей, как YEAR (date) = x. Это предотвращает использование SQL Server любых индексов в «дате». Рассчитайте самые ранние и последние даты и сделайте что-то вроде «date BETWEEN x AND y» –

+0

Я согласен. Запрос обновлен. –

0

Единственная проблема состоит в том, что я требую ежемесячную сумму, за каждый из последних 12 месяцев, а затем всего за последние 12 месяцев. В противном случае я вижу, как лучше улучшить SQL, а затем использовать vb6 code oculd.

+0

Хмм мой аккаунт, похоже, удален. Извините, что ответили ребятами. –

1

я бы решить это «округлением» дату на месяц, а затем Группировка по этому месяц-день, и в общей сложности на использованную сумму:

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] может быть отформатирован, чтобы показать месяц/Дата одобрена или в отдельных столбцах.

где положение может быть параметризацию, чтобы обеспечить соответствующий диапазон записей, которые должны быть включены

+0

P.S. Пожалуйста, спросите, хотите ли вы пример «форматирования», который я называю – Kristen

+0

+1, хорошее решение, я закончил это. Я также думаю, что вы имели в виду «усечение», а не «округление». – orip

0

Решение, которое я придумал бы:

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.

Смежные вопросы