簡體   English   中英

T-SQL:按年、月排序結果

[英]T-SQL: sorting results by year, month

我有以下聲明:

select
    (datename(MM, SomeDate) + ' ' + datename(day, SomeDate)) as D,
    count(SomeID) as IDs
from dbo.SomeTable
where
    datename(MM, SomeDate) = @Month
    and datename(YYYY, SomeDate) = @Year
group by
    datename(YYYY, SomeDate),
    datename(MM, SomeDate),
    datename(DD, SomeDate);

它有效,但它對結果進行排序,如下所示:

July 1, 2011 - 2
July 10, 2011 - 4
July 2, 2011 - 10

如何讓它在 7 月 2 日之后顯示 7 月 10 日? 我知道這很簡單,但我找不到問題。 謝謝你的幫助!

編輯:伙計們,我知道必須有一個“訂單”,我認為這很明顯。 但是“正常”排序會產生相同的結果(請參閱我的評論)。 我認為這與整理有關,但我不是那里的專家。

設法通過將查詢主體移動到子查詢中來修復它,包括 Group by 子句中的SomeDate (確保刪除時間部分)。

我個人會避免在此查詢中使用DateName - 我寧願使用DatePart並保留所有數字,但基於您的查詢:

設置:

create table SomeTable (
    SomeDate datetime not null,
    SomeID int not null
)
go
insert into SomeTable (SomeDate,SomeID)
select '20110701',1 union all
select '20110702',1 union all
select '20110710',1

詢問:

declare @Month varchar(10)
declare @Year int
select @Month='July',@Year=2011

select D,IDs from (
select
    (datename(MM, SomeDate) + ' ' + datename(day, SomeDate)) as D,
    count(SomeID) as IDs
    ,DATEADD(day,DATEDIFF(day,0,SomeDate),0) as SomeDate
from dbo.SomeTable
where
    datename(MM, SomeDate) = @Month
    and datename(YYYY, SomeDate) = @Year
group by
    datename(YYYY, SomeDate),
    datename(MM, SomeDate),
    datename(DD, SomeDate),
    DATEADD(day,DATEDIFF(day,0,SomeDate),0)
) t
order by SomeDate

如果SomeDateDATE類型,那么您可以簡單地添加ORDER BY SomeDate GROUP BY也可以簡化:

select
    (datename(MM, SomeDate) + ' ' + datename(day, SomeDate)) as D,
    count(SomeID) as IDs
from dbo.SomeTable
where
    datename(MM, SomeDate) = @Month
    and datename(YYYY, SomeDate) = @Year
group by
    SomeDate 
order by
    SomeDate ;

WHERE也可以簡化。


如果它是DATETIME類型,您可以使用:

select
    (datename(MM, DATEADD(dd, 0, DATEDIFF(dd, 0, SomeDate)))
      + ' ' + datename(day, DATEADD(dd, 0, DATEDIFF(dd, 0, SomeDate)))) as D,
    count(SomeID) as IDs
from dbo.SomeTable
where
    datename(MM, SomeDate) = @Month
    and datename(YYYY, SomeDate) = @Year
group by
    DATEADD(dd, 0, DATEDIFF(dd, 0, SomeDate)) 
order by
    DATEADD(dd, 0, DATEDIFF(dd, 0, SomeDate)) ;

您正在丟失somedate的信息,並且無論如何都不能用於 ORDER BY

按 DATENAME 排序不是您想要的,因為 7 月在 8 月之后

因此,將更多派生列添加到 GROUP BY 以便稍后使用 DATEPART 進行排序,它給出數字

select
    (datename(MM, SomeDate) + ' ' + datename(day, SomeDate)) as D,
    count(SomeID) as IDs
from
    dbo.SomeTable
where
    datename(MM, SomeDate) = @Month
    and datename(YYYY, SomeDate) = @Year
group by
    datename(YYYY, SomeDate),
    datename(MM, SomeDate),
    datename(DD, SomeDate),
    datepart(YYYY, SomeDate),
    datepart(MM, SomeDate),
    datepart(DD, SomeDate)
order by
    datepart(YYYY, SomeDate),
    datepart(MM, SomeDate),
    datepart(DD, SomeDate)

您需要添加一個ORDER BY子句並按SomeDate

SELECT COUNT(*)
   /*Event_type
   EventDate*/ AS EventCount
  ,MONTH(EventDate) AS MONTH
  ,YEAR(EventDate) AS YEAR
  ,DATENAME(MONTH ,EventDate) AS MonthName
FROM   EventTable
WHERE  (Event_type = 'TypeOfEvent')
   AND (Userid NOT LIKE '%*%')
GROUP BY
   YEAR(EventDate)
  ,MONTH(EventDate)
  ,DATENAME(MONTH ,EventDate)
ORDER BY
   YEAR
  ,MONTH 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM