在T-SQL查询中对月/年对进行排序

时间:2010-04-01 06:05:00

标签: sql sql-server tsql group-by sql-order-by

我正在编写一个用于显示月份和年份的存储过程。它正在工作,但它没有按所需顺序返回行。

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年3月
  2010年1月
  2010年2月

但这不是订单(desc)。

6 个答案:

答案 0 :(得分:4)

杰夫史密斯写了excellent article关于如何按年 - 月对进行分组和排序的方法。我特别喜欢他将日期四舍五入到该月的第一天并按该值进行分组的方法:

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

它更快,因为它不需要字符串连接。

您可以稍后在查询中将此值转换为年 - 月组合,方法是在其上执行YEARMONTH以获得用户友好的表示。

答案 1 :(得分:2)

您希望按日期时间值排序,但您的群组没有。一种方法是在每个组中任意选择一个创建日期(例如MAX),然后按这些方式选择:

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

答案 2 :(得分:1)

我用子查询解决了这类问题。内部查询同时具有DisplyName和SortIndex。 外部查询显示名称,但对索引进行排序。

e.g

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

) as Temp
order by Temp.SortIndex

只需添加显示/索引对

,即可将此常规方法用于任意数量的字段

答案 3 :(得分:0)

结束时:

order by a.createddate desc

答案 4 :(得分:0)

不是最好的解决方案,但在您弄明白之前应该有效。

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

答案 5 :(得分:-2)

按1(desc)排序