Commander Par mois et année en sql avec sum

J'ai une procédure stockée et l'instruction select est:

SELECT { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate) 

ceci montre la sum totale pour chaque mois Mais j'ai besoin de order le résultat par mois et par année coz mon résultat montré comme:

 April 2013 February 2013 January 2013 June 2013 March 2013 May 2013 

Quelle est la solution dans un tel cas?

Essaye ça:

 SELECT { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, MONTH(OrderDate), YEAR(OrderDate) order by Year(orderDate),month(OrderDate) 

Notez que vous devez append tous les champs que vous commandz à la clause group by

Si vous voulez order en janvier, février, mars

 SELECT month(OrderDate) MonthName, year(OrderDate) Year, sum(TotalValue) Profits FROM [Order] WHERE month(OrderDate) = @year ORDER BY year(OrderDate), month(OrderDate) GROUP BY year(OrderDate), month(OrderDate) 

Je pense que vous devriez utiliser order by clause à la fin

 SELECT { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate) ORDER BY { fn MONTH(OrderDate) }, YEAR(OrderDate) 

ou

tu peux faire comme ça

 SELECT CASE { fn MONTH(OrderDate) } when 0 then 'JAN' when 1 then 'FEB' when 2 then 'MAR' when 3 then 'APR' when 4 then 'MAY' when 5 then 'JUN' when 6 then 'JUL' when 7 then 'AUG' when 8 then 'SEP' when 9 then 'OCT' when 10 then 'NOV' when 11 then 'DEC' END AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTH(OrderDate) }, YEAR(OrderDate) ORDER BY { fn MONTH(OrderDate) }, YEAR(OrderDate) 

Ajoutez simplement

 Order by max(OrderDate) 

à la fin.

 SELECT { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate) Order by max(OrderDate) 

Maintenant, comment cela fonctionne:

Si vous commandz par mois, année séparément, il ira dans l'ordre croissant du mois dans l'ordre alphabétique (avril avant janvier). Si vous commandz par date de command, l'identifiant sera commandé en fonction d'une valeur de date qui est bien entendu sortingée par mois / année.

 select cast(year(appointmentdate) as char(4))+''+ case when len(cast(month(appointmentdate)as char(2)))=1 then '0'+cast( month(appointmentdate) as char(2) ) else cast(month(appointmentdate) as char(2))end as apporder from timeslots group by appointmentdate order by appOrder 

Essaye ça. Cela fonctionne parfaitement. Notez que vous entrez déjà une valeur d'année. Vous n'avez donc pas besoin de order ou de regrouper l'année puisque vous ne pouvez choisir qu'une seule année à la fois. Donc, le code supplémentaire n'est pas nécessaire.

 SELECT { fn MONTHNAME(OrderDate) } AS MonthName, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, DATEPART(M, OrderDate) ORDER BY DATEPART(M, OrderDate) 

Utilisation La requête suivante fonctionnera pour vous.

 SELECT { fn MONTHNAME(OrderDate) } AS MonthName, datepart(MM,OrderDate) AS Month, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits FROM [Order] WHERE (YEAR(OrderDate) = @year) GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate), datepart(MM,**OrderDate**) ORDER BY datepart(MM,**OrderDate**)