Упорядочение пар месяц / год в запросе T-SQL - PullRequest
3 голосов
/ 01 апреля 2010

Я пишу хранимую процедуру для отображения месяца и года. Он работает, но не возвращает строки в нужном порядке.

ALTER procedure [dbo].[audioblog_getarchivedates]  
as  
begin  
select DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) as ArchiveDate 
from audio_blog a 
group by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) 
order by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) desc
end

Результаты будут такими:

Март 2010
Январь 2010
Февраль 2010

Но это не в порядке (desc).

Ответы [ 6 ]

4 голосов
/ 25 октября 2010

Джефф Смит написал превосходную статью о том, как группировать и упорядочивать по парам год-месяц. Мне особенно нравится его подход округления даты до первого дня месяца и группировки по этому значению:

GROUP BY dateadd(month, datediff(month, 0, SomeDate),0)

Это быстрее, потому что не требует объединения строк.

Вы можете преобразовать это значение в комбинацию год-месяц позже в запросе, выполнив для него YEAR и MONTH для удобного представления.

2 голосов
/ 01 апреля 2010

Вы хотите упорядочить по значению даты и времени, но у ваших групп этого нет. Один из способов состоит в том, чтобы выбрать одну из созданных дат произвольно (например, МАКС) в каждой группе и упорядочить по следующим параметрам:

select ArchiveDate from (
select DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) as ArchiveDate, MAX(createddate) as createddate
from (select CONVERT(datetime,createddate) as createddate from (select '20100101' as createddate union all select '20100201' union all select '20100301') t) a 
group by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) ) g
order by g.createddate desc
1 голос
/ 18 сентября 2011

Я решаю этот тип проблемы с помощью подзапроса. Внутренний запрос имеет как DisplyName, так и SortIndex. Внешний запрос отображает имя, но сортирует по индексу.

* 1003 например *

select a,b,c DisplayName   from
(select a, b,c, DisplayName, SortIndex....

) as Temp
order by Temp.SortIndex

Вы можете использовать этот общий подход с любым количеством полей, просто добавив пару отображения / индекса

0 голосов
/ 01 апреля 2010

заказ по 1 (деск)

0 голосов
/ 01 апреля 2010

Не лучшее решение, но должно работать, пока вы не разберетесь.

ALTER PROCEDURE [dbo].[Audioblog_getarchivedates] 
AS 
  BEGIN 
    SELECT DISTINCT Datename(MONTH,a.DATE) + ' ' + Datename(YEAR,a.DATE) AS archivedate,
    Cast(Datename(MONTH,a.DATE) + ' ' + Datename(YEAR,a.DATE) AS DATETIME) AS tmp
    FROM audio_blog a 
    ORDER BY tmp DESC 
  END
0 голосов
/ 01 апреля 2010

Конец:

order by a.createddate desc
...