[英]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
如果SomeDate
是DATE
類型,那么您可以簡單地添加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.