2015-07-06 4 views
3

Я имею SQL запрос как:Сортировать Sql запрос по месяцам

select dateName(month, DateAccessed) "Month" 
, count(1) totalVisits 
, count(distinct l.userName) UsersVisit 
from and where clause goes here 
group by dateName(monthDateAccessed) 
order by Month 

Выход я получаю

Month totalVisits UsersVisit 
April   100  25 
February  200  35 
July   300  45 
March   400  55 
May   500  65 

Но Ouput я хочу в следующем порядке:

February  200  35 
March   400  55 
April   100  25 
May   500  65 
July   300  45 

Как я могу это получить?

ответ

5

Используйте либо month(DateAccessed) или datepart(month, DateAccessed) извлечь номер месяца и использовать его в предложении order by. Однако вы должны добавить его в пункт group by тоже:

SELECT 
    DATENAME(month, DateAccessed) "Month", 
    COUNT(1) totalVisits, 
    COUNT(DISTINCT l.userName) UsersVisit 
FROM and where clause goes here 
GROUP BY 
    MONTH(dateaccessed), 
    DATENAME(month, DateAccessed) 
ORDER BY 
    MONTH(dateaccessed); 

Если ваши данные хранятся данные более чем на один год, вы должны включать в год в порядке и съемках групповых пунктов (и оператор выбора), если вы еще не убедитесь, что вы только получаете данные от одного года в предложении where.

0

Вам просто нужно изменить положение ORDER BY на заказ по номеру месяца в DateAccessed:

select dateName(month, DateAccessed) "Month" 
, count(1) totalVisits 
, count(distinct l.userName) UsersVisit 
from and where clause goes here 
group by dateName(monthDateAccessed) 
order by Month(DateAccessed) 
+0

Я получаю сообщение об ошибке: ** недействителен в предложении ORDER BY, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. ** –

0

Вы заказываете по DATENAME, который является строкой. Попробуйте заказ на DATEPART (целое число) вместо:

select dateName(month, DateAccessed) "Month" 
, count(1) totalVisits 
, count(distinct l.userName) UsersVisit 
from and where clause goes here 
group by dateName(monthDateAccessed), DATEPART(mm, dateAccessed) 
order by DATEPART(mm, dateAccessed) 
+0

Я получаю сообщение об ошибке: ** недействителен в предложении ORDER BY потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY **. –

+0

Извините, что я не учитывал вычисленное поле в ответе, попробуйте мое обновление. – Wibbler

-1

Добавьте одну колонку month(DateAccessed) as MonthNo и установить этот столбец в порядке.

select dateName(month, DateAccessed) "Month", month(DateAccessed) as MonthNo, 
, count(1) totalVisits 
, count(distinct l.userName) UsersVisit 
from and where clause goes here 
group by dateName(monthDateAccessed) 
order by MonthNo 
+0

Добавление столбца разбило бы его 'GROUP BY', и вообще не обязательно включать дополнительные столбцы для изменения порядка сортировки. – Siyual

+0

Я так не думаю, потому что мы добавили функцию с уже используемым столбцом :) –

+0

Кроме того, T-SQL не разрешает использование псевдонима, определенного в той же области действия для порядка. – jpw

Смежные вопросы