2013-06-24 27 views
6

ich eine gespeicherte Prozedur und die Select-Anweisung habe, ist:Sortierung nach Monat und Jahr in SQL mit summe

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) 

dies für jeden Monat die Summe zeigt Aber ich brauche das Ergebnis nach Monat und Jahr bestellen coz mein Ergebnis gezeigt wie:

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

Was ist die Lösung in einem solchen Fall?

Antwort

4

Versuchen Sie folgendes:

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) 

Hinweis müssen Sie alle Felder hinzufügen, die Sie von der Gruppe durch Klausel

+0

danke das funktioniert Toll .. :)) Perfekt – Bruce

1

ich glaube, Sie order by Klausel am Ende

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) 

oder

Sie dieses

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) 
+0

Dank aber leider ich schon versucht, diese und geben immer noch das gleiche Ergebnis April dann Februar hat der Januar ..... – Bruce

+0

ich meine Abfrage ... überprüfen jetzt bearbeitet haben und lassen Sie mich wissen – Ravi

+0

danke in diesem Fall fn MONAT (OrderDate) nicht in der Gruppe von so habe ich aber es anstelle von FN MONTHNAME (OrderDate), und das ist Arbeit gut, aber ich muss den Namen des Monats nicht Nummer zeigen .. – Bruce

1

Wenn Sie eine Bestellung aufgeben möchten, wie Jan, Feb, Verwendung März tun können, verwenden sollten,

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) 
+0

ich versuchte dies und ich bekomme diesen fehler: Spalte "Order.OrderDate" ist ungültig in der BESTELLUNG BY-Klausel, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. – Bruce

+0

danke, ja es funktioniert und dieser Fall mein Ergebnis zeigen die Monatsnummer nicht Name :) – Bruce

+0

@Ryan Sie brauchen es nicht in den 'SELECT' Teil zu setzen, müssen Sie jede Reihenfolge von Klauseln in die' GROUP BY ' –

0

Fügen Sie einfach

am Ende hinzu.

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) 

Jetzt darüber, wie es funktioniert:

Wenn Sie mit dem Monat bestellen, Jahr getrennt, wird es in aufsteigender Reihenfolge von Monat in alphabetischer Reihenfolge (April vor Januar) gehen. Wenn Sie nach Bestelldatum bestellen, wird die ID basierend auf einem Datumswert bestellt, der natürlich nach Monat/Jahr geordnet ist.

+0

lassen Sie mich wissen, ob es Ihren Zweck erfüllt .. !! – user2407394

+0

Dies funktioniert nicht, da das orderby-Feld in der Gruppe von Klausel –

+0

sein muss danke, aktualisiert meine Antwort .. !! – user2407394

0

Verwendung Nach Abfrage der Bestellung wird es für Sie arbeiten.

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**) 
+1

Hallo, könntest du ein wenig deine Antwort erklären, damit das OP deine Einsicht verstehen kann? Ziemlich bitte. – bufh

0
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 
0

bereits. Es funktioniert perfekt. Beachten Sie, dass Sie bereits einen Jahreswert eingeben. Sie müssen also Jahr nicht bestellen oder gruppieren, da Sie nur ein Jahr auswählen können. Daher wird der zusätzliche Code nicht benötigt.

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) 
Verwandte Themen