Замовлення на місяць і рік у кв з сумою

У мене є збережена процедура, а оператор select:

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)

це показує суму на кожний місяць Але мені потрібно замовити результат за місяцем і роком, тому що мій результат відображається так:

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

Що таке рішення в такому випадку?

8

7 Відповіді

Спробуйте це:

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)

Зауважте, що вам потрібно додати будь-які поля, які ви впорядковуєте, до пункту group by

8
додано
спасибі, що працює Велика .. :)) Ідеально
додано Автор Bruce, джерело

Думаю, ви повинні використати пункт order by наприкінці

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)

або

Ви можете це зробити

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)
1
додано
Я відредагував свій запит ... перевірте зараз і повідомте мені
додано Автор Ravi, джерело
ПЕРЕВІРЬ ЗАРАЗ......
додано Автор Ravi, джерело
@brce що сталося з вами, ви дійсно плутаєтеся прийняти будь-яку відповідь? ? : D
додано Автор Ravi, джерело
hehe вибачте я новий на сайті, я думаю, що я можу прийняти більш ніж одну відповідь :))) завдяки @JWeavers
додано Автор Bruce, джерело
Так, це Велике Рішення Також, багато спасибі :)
додано Автор Bruce, джерело
Дякуємо вам у цьому випадку fn MONTH (OrderDate) не в групі, тому я маю, але замість fn MONTHNAME (OrderDate), і це добре, але мені потрібно показати ім'я місяця, а не номер ..
додано Автор Bruce, джерело
спасибі, але вибачте, я пробував це і досі даю той же результат в квітні, то в лютому січня .....
додано Автор Bruce, джерело

Якщо ви хочете замовити, як використовувати січень, лютий, березень

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)
1
додано
Ви маєте рацію - я вилучив оригінальний неправильний коментар. Дякую
додано Автор Ryan, джерело
@Ryan не потрібно розміщувати його в частині SELECT , потрібно вносити будь-яке замовлення за допомогою пунктів у GROUP BY
додано Автор Bob Vale, джерело
Я спробував це і я отримую цю помилку: Стовпець "Order.OrderDate" є недійсним у стані ORDER BY, оскільки він не міститься ні в агрегатній функції, ні в GROUP BY.
додано Автор Bruce, джерело
спасибі, так це працює і цей випадок мій результат показують номер місяця не ім'я :)
додано Автор Bruce, джерело
так це велике спасибі Райан і Брюс
додано Автор Bruce, джерело

Просто додайте

Order by max(OrderDate) 

в кінці.

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) 

Тепер про те, як це працює:

Якщо ви замовляєте по місяцях, роках окремо, воно йде у порядку зростання в алфавітному порядку (квітень до січня). Якщо ви замовляєте по даті замовлення, то номер буде упорядковано на основі значення дати, яке, звичайно, упорядковано за місяцем/роком.

1
додано
спасибі, оновив мою відповідь .. !!
додано Автор user2407394, джерело
дайте мені знати, якщо він служить вашій меті .. !!
додано Автор user2407394, джерело
Це не буде працювати, оскільки поле orderby повинно бути в пропозиції групи
додано Автор Bob Vale, джерело
так, як Боб Саїд , дякую всім :))
додано Автор Bruce, джерело
thanks @ user2407394
додано Автор Bruce, джерело
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
додано

Використовуйте наступний запит для вас.

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**)
0
додано
Привіт, не могли б ви пояснити трохи вашу відповідь, так що ОП може зрозуміти ваше розуміння? Досить будь ласка.
додано Автор bufh, джерело

Спробуйте це. Вона прекрасно працює. Зауважте, що ви вже вводите значення року. Так що вам не потрібно замовляти або групувати рік, оскільки ви можете вибрати тільки один рік за один раз. Так що додатковий код не потрібен.

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)
0
додано