Comment la somme du montant total pour les 12 derniers mois à l'aide des paramètres
Je voudrais résumer les 12 derniers mois, les valeurs à partir d'une requête sql.
Le problème est de résumer les 12 derniers mois, au lieu de prendre simplement l'ensemble de l'année.
Alors, quand je sélectionne Mars 2000 en tant que par défaut dans mes paramètre,
Je veux la requête pour résumer: à partir de Mars 1999-Mars 2000.
C'est ce que j'ai obtenu jusqu'à présent:
SELECT Name, SUM(sales) as totalsales, year_month
FROM Total_Sales
WHERE
(year_month = @year_month)
GROUP BY Name, year_month
Merci pour toute aide!
--EDIT--
SELECT Name, SUM(sales) as totalsales, year_month
FROM Total_Sales
WHERE
(year_month >= @From) AND
(year_month <= @To)
GROUP BY Name, year_month
Ajouté après les suggestions de "Steve Morgan"
Peut-on ajouter une moyenne des 12 derniers mois, en quelque sorte, sans sélection de 12 mois dans les paramètres.
Laisser le "@ "Dans" paramètre de décider de la valeur de départ. Quelque chose comme: AVG(@à Partir de 12 mois)??
Merci encore pour l'aide!
--EDIT 2--
La ROW_NUMBER() fonction est très pratique pour résoudre ce problème.
Ma requête ressemble à ceci maintenant:
SELECT Name, SUM(sales)
FROM
(
SELECT rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY year, year_month)
, Name
, sales = SUM(sales)
FROM Total_Sales ts
WHERE
(year_month>= @From) AND
(year_month<= @To)
GROUP BY
Name
, year
, year_month
) ts
WHERE
rn <= 12
GROUP BY
Name
- Ce type de la year_month champ?
- year_month est: 1,2,3,4,5,6,7,8,9,10,11,12
- Est-il aussi un mois ou la date de champ?
- Votre solution n'est pas tout à fait ce que Lieven vous a donné. Essayez-la avec des feintes de données couvrant
2010-01
à2011-12
pour un nom, et2011-01
à2011-12
pour un autre nom, puis d'exécuter votre requête pour2010-06
à2011-05
. Je ne crois pas que cela vous donnera le résultat que vous recherchez. Quelle que soit la solution que vous adoptez, vous devez mettre des conditions à la fois de l'Année et Year_Month champs. - Ok vais essayer cela. Le changement que le year_month champ est créé par une mise à JOUR à l'aide de la "ans" & "mois" à partir de la table elle-même. de sorte qu'il ressemble à ceci maintenant: 2000_01, 2000_02 etc.
- Si vous allez à modifier le schéma, vous pourriez être mieux avisé de rendre le champ DateTime avec un nom tel que MonthStart. La logique devient alors Beaucoup plus simple.
Vous devez vous connecter pour publier un commentaire.
Ce code est plus long que Steve Morgan, mais est conçu pour permettre l'utilisation de l'optimiseur de la capacité d'utiliser les INDEX existant sur le
year
etyear_month
champs. Ce n'est pertinente que si vous avez une relativement grande table car elle est conçue de manière efficace savoir quels dossiers peuvent être ignorées.(Cela suppose également de MS SQL Server, mais la logique est applicable à d'autres RDBMSes.)
Notes:
1. Cela donnera les résultats pour la période de 12 mois, jusqu'en juin 2011
2. Pas de données avant juillet 2010 seront inclus
3. L'écart de la Tige de données ne cause pas la Note 3 pour être violée
4. Jane données manquantes en Mai 2011 et juin 2011 ne cause pas la Note 3 pour être violée
5. La formulation de la clause where permet des Index pour être utilisé
Je ne peux pas dire à partir de votre exemple, comment year_month est stocké, ce qui rend difficile de décider si elle se prête à être interrogé de cette façon.
Dans de tels cas, j'utilise ce que j'appelle un relatif mois, j'ai calculer que
Donc, janvier 2000 Relatif Mois 0, février 2010 Relatif Mois 121, etc.
C'est facilement convertibles en/à partir d'une Année et le Mois à l'aide de SQL Server Fonctions Scalaires et facile à requête à l'aide de >, <, etc.
Edit:
Juste de voir vos commentaires sur ce year_month est et aussi que vous avez un an. Une fonction scalaire de calculer une relative valeur de mois de l'année et year_month colonnes va travailler pour vous.
Alors vous pouvez faire:
Même si c'est plus efficace pour ajouter un relative_month colonne de votre table et le calcul de la valeur lors de l'écriture du dossier.
Edit 2:
Vous avez demandé comment GetRelativeMonth fonctionne, si elle est ici:
En supposant que vous utilisez SQL Server, vous pouvez utiliser le ROW_NUMBER fonction de concocter un sous-ensemble de vos données à partir de laquelle vous pouvez sélectionner le résultat final.
Instruction SQL
Des Données De Test
<=
, et je viens écrémé et supposé que c'était sur la droite.Vous pourriez peut-être utiliser la fonction? où YourDate ENTRE minValue ET maxvalue
SELECT Nom, SUM(ventes) comme totalsales, year_month DE Total_Sales OÙ year_month = DATEADD(MOIS,-12,'31-Mars-2000') GROUP BY Nom, year_month
Essayer quelque chose comme ça