T-SQL: сортировка результатов по году, месяцу - PullRequest
0 голосов
/ 10 июля 2011

У меня есть следующее утверждение:

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

Как настроить отображение 10 июля после 2 июля? Я знаю, что это что-то простое, но я не могу найти проблему. Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Ребята, я знаю, что должен быть "заказ", я думал, что это вполне очевидно. Но «нормальный» порядок дает тот же результат (см. Мои комментарии). Я думаю, что это связано с сопоставлением, но я здесь не эксперт.

Ответы [ 5 ]

2 голосов
/ 10 июля 2011

Удалось исправить это, переместив тело вашего запроса в подзапрос, включая SomeDate в предложении group by (обеспечив удаление части времени).

Я бы лично не использовал 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
1 голос
/ 10 июля 2011

Если 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)) ;
1 голос
/ 10 июля 2011

Вы теряете информацию из somedate и , она в любом случае недоступна для ORDER BY

Сортировка по DATENAME - это не то, что вам нужно, потому что июль после августа

Итак, добавьте больше производных столбцов в 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)
0 голосов
/ 07 января 2012
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 
0 голосов
/ 10 июля 2011

Вам необходимо добавить предложение ORDER BY и порядок на SomeDate.

...