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

C'est le code que j'ai actuellement pour calculer le total dépensé pour un mois donné. Je souhaite développer ceci pour récupérer les totaux par mois, pour les 12 derniers mois. La façon dont je vois ceci serait de faire une boucle dans la valeur CurrentMonth, et si la valeur CurrentMonth atteint 0, ramener la valeur de CurrentYear back 1. Utiliser la variable de boucle (i) pour construire un tableau de 12 valeurs : MTotal()Construction d'un total mensuel des 12 derniers mois

Qu'en pensez-vous?

+0

Comme écrit, vous n'utilisez pas et donc n'avez pas besoin de sélectionner InvMonth et InvYear puisque vous connaissez la valeur des données d'entrée. Vous devriez également obtenir le SGBD pour faire SUM (Spent), de sorte que vous vous retrouvez avec une ligne pour le mois donné. –

+0

(Vous pouvez conserver InvMonth et InvYear à des fins de débogage, mais si vous le faites, vous devrez GROUP BY lorsque vous ajouterez SUM). –

Répondre

1

Un groupe par devrait vous mettre en route.

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 

de DATEDIFF de Josh est une meilleure solution que mon TOP et ORDER BY

+0

Vous ne voulez probablement pas utiliser TOP 12. Une meilleure façon serait de vérifier une plage de dates. Évitez également des choses comme YEAR (date) = x. Cela empêche SQL Server d'utiliser des index sur "date". Calculer les dates les plus anciennes et les plus récentes et faire quelque chose comme "date entre x et y" –

+0

J'accepte. La requête a été mise à jour. –

0

d'origine Le seul problème est que je besoin d'un total mensuel, pour chacun des 12 derniers mois plutôt que la total pour les 12 derniers mois. Sinon, je vois comment améliorer le SQL plutôt que d'utiliser le code vb6 oculd soit une meilleure option.

+0

hmm mon compte semble avoir été supprimé. Désolé de répondre avec un commentaire les gars. –

1

J'aborderait ce par « arrondir » la date du mois, puis regroupement par ce mois-jour, et le total du montant dépensé:

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] 

Le [MonthDate] peut être formaté pour montrer Mois/Date appropriée, ou dans des colonnes séparées.

La clause WHERE peut être paramétrés pour fournir une gamme appropriée de dossiers à inclure

+0

P.S. S'il vous plaît demander si vous souhaitez un exemple de la "mise en forme" je me réfère à – Kristen

+0

+1, bonne solution, j'ai fini par le faire. Je pense aussi que vous vouliez dire "tronquer", pas "arrondir". – orip

0

La solution que je suis venu avec serait:

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 

Je crois que cela devrait fonctionner comme prévu. Cependant, j'ai toujours hâte de voir quelles solutions vous pouvez trouver, ou si quelqu'un voit un problème avec ym.