2016-07-20 2 views
1

J'utilise select:somme à cinq années dans SQL Server

Select year, month, par1, par2, par3, value 
from table1 

pour produire ce tableau:

enter image description here

Maintenant, je veux calculer la somme contient à cinq ans retour (c'est 60 mois).

résultat devrait être comme ci-dessous:

enter image description here

Comment puis-je faire cela?

+0

vous colonne de mois est une chaîne? une colonne de date ou un entier? – Squirrel

+0

Comment déterminez-vous en quelle année la période de cinq ans devrait commencer? –

+0

oui: année, mois, par1, par2, par3 sont Chaîne – 4est

Répondre

1

pour vous le cas, puisque les tableaux sont exprimés en chaîne, i utilise un CTE pour formuler une colonne de date pour le calcul

; with 
cte as 
(
    select *, date = convert(date, year + '-' + substring(month, 2, 2) + '-01', 121) 
    from table1 
) 
select * 
from cte c 
    outer apply 
    (
     select SumOfValue = sum(Value) 
     from cte x 
     where x.date >= dateadd(month, -60, c.date) 
     and x.date <= c.date 
    ) t 

nécessaire si vous avez besoin de la somme() au groupe par un autre colonne, ajoutez la condition à la requête OUTER APPLY

EDIT 1:

select * 
from cte c 
    outer apply 
    (
     select SumOfValue = sum(x.Value) 
     from cte x 
     where x.date >= dateadd(month, -60, c.date) 
     and  x.parameter1 = c.parameter1 
     and  x.parameter2 = c.parameter2 
     and  x.date  <= c.date 
    ) t 
+0

dateadd (mois, -60, c.date) -> devrais-je ici convertir mois à date? parce que j'ai une erreur "'date' n'est pas une option dateadd reconnue." – 4est

+0

vous utilisez 'SQL Server 2008' droit? Cela devrait fonctionner. Si ce n'est pas le cas, utilisez 'date = convert (datetime, ...)' – Squirrel

+0

oui, sql ser 2008 .... pouvez-vous mettre à jour votre requête ci-dessus? – 4est