Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
Есть таблица с одним полем datetime.
Как сгруппировать по дням, но при этом вывести полную дату?

Я сделал так:
SELECT DAY(EventDate) AS 'Date', Count(*) AS 'Count'  FROM   Sms
GROUP BY DAY(EventDate)

Типа группируется, но как вывести полную дату (т.е. месяц, год, число)?

сервер SQL2005
4 ноя 09, 18:50    [7882113]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Может, так надо?
SELECT CONVERT(CHAR(10),EventDate,104) [Date], COUNT(*) [Count]
FROM Sms
GROUP BY CONVERT(CHAR(10),EventDate,104)
ORDER BY [Date];
4 ноя 09, 18:53    [7882119]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Может, так надо?
SELECT CONVERT(CHAR(10),EventDate,104) [Date], COUNT(*) [Count]
FROM Sms
GROUP BY CONVERT(CHAR(10),EventDate,104)
ORDER BY [Date];
Поправка
SELECT CONVERT(CHAR(10),EventDate,104) [Date], COUNT(*) [Count]
FROM Sms
GROUP BY CONVERT(CHAR(10),EventDate,104)
ORDER BY CONVERT(DATETIME, CONVERT(CHAR(10),EventDate,104),104);
4 ноя 09, 18:59    [7882133]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Если номер дня один и тот же (например, для среды он = 4), а даты разные, то я так понимаю, разные даты должны быть указаны в РАЗНЫХ строках - так ? Тогда попробуйте это:
declare @t table(dt datetime)
insert into @t 
select '20090201' union all
select '20090301' union all
select '20090202' union all
select '20090203' union all
select '20090204' union all
select '20010505' union all
select '20040605' union all
select '20090705' 

select dt,cnt=count(*)over(partition by day(dt)) from @t
result:
dtcnt
2009-02-01 00:00:00.0002
2009-03-01 00:00:00.0002
2009-02-02 00:00:00.0001
2009-02-03 00:00:00.0001
2009-02-04 00:00:00.0001
2001-05-05 00:00:00.0003
2004-06-05 00:00:00.0003
2009-07-05 00:00:00.0003
4 ноя 09, 19:13    [7882164]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
iap
iap
Может, так надо?
SELECT CONVERT(CHAR(10),EventDate,104) [Date], COUNT(*) [Count]
FROM Sms
GROUP BY CONVERT(CHAR(10),EventDate,104)
ORDER BY [Date];
Поправка
SELECT CONVERT(CHAR(10),EventDate,104) [Date], COUNT(*) [Count]
FROM Sms
GROUP BY CONVERT(CHAR(10),EventDate,104)
ORDER BY CONVERT(DATETIME, CONVERT(CHAR(10),EventDate,104),104);


Как бы не очень хорошо, т.к. колонка получается строковой, а нужно чтоб она была datetime. Я так понял эту строку теперь конвертить в datetime?
4 ноя 09, 19:13    [7882168]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
PS. Или вот еще так можно:
select t1.dt,cnt=count(t2.dt) 
  from @t t1 
  join @t t2 on day(t1.dt)=day(t2.dt) 
group by t1.dt
order by day(t1.dt)
4 ноя 09, 19:17    [7882182]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
Ozzy-Osbourne
Если номер дня один и тот же (например, для среды он = 4), а даты разные, то я так понимаю, разные даты должны быть указаны в РАЗНЫХ строках - так ? Тогда попробуйте это:
declare @t table(dt datetime)
insert into @t 
select '20090201' union all
select '20090301' union all
select '20090202' union all
select '20090203' union all
select '20090204' union all
select '20010505' union all
select '20040605' union all
select '20090705' 

select dt,cnt=count(*)over(partition by day(dt)) from @t
result:
dttcnt
2009-02-01 00:00:00.000t2
2009-03-01 00:00:00.000t2
2009-02-02 00:00:00.000t1
2009-02-03 00:00:00.000t1
2009-02-04 00:00:00.000t1
2001-05-05 00:00:00.000t3
2004-06-05 00:00:00.000t3
2009-07-05 00:00:00.000t3



Ваш скрипт отработал неправильно

вот что у меня выдал

DateEvent count
========================
2009-03-01 00:00:00.000 2
2009-04-01 00:00:00.000 2
2009-11-03 15:52:25.950 10
2009-11-03 15:52:28.137 10
2009-11-03 15:52:29.480 10
2009-11-03 15:52:30.260 10
2009-11-03 15:52:31.683 10
2009-11-03 15:52:33.497 10
2009-11-03 15:52:34.510 10
2009-11-03 15:52:35.357 10
2009-11-03 15:52:36.293 10
2009-11-03 15:52:37.027 10
2009-10-10 00:00:00.000 1
4 ноя 09, 19:18    [7882186]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iljy
Member

Откуда:
Сообщений: 8711
CmeTanka

Как бы не очень хорошо, т.к. колонка получается строковой, а нужно чтоб она была datetime. Я так понял эту строку теперь конвертить в datetime?


используйте DATEADD(day, datediff(day, 0, EventDate), 0) для отсечения времени - и ничего никуда преобразовывать будет не надо
4 ноя 09, 19:20    [7882191]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
CmeTanka,

Ваш вопрос был: "Как сгруппировать по дням, но при этом вывести полную дату?"
Функция day() возвращает номер дня, начиная с воскресенья (Вс=0).
Нарисуйте, плз, что в итоге Вы хотите получить ?
4 ноя 09, 19:20    [7882194]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ozzy-Osbourne,

day - это как бы день месяца:) и от среды он не зависит;) день недели - datepart(dw, getdate())
4 ноя 09, 19:23    [7882204]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
iljy
CmeTanka

Как бы не очень хорошо, т.к. колонка получается строковой, а нужно чтоб она была datetime. Я так понял эту строку теперь конвертить в datetime?


используйте DATEADD(day, datediff(day, 0, EventDate), 0) для отсечения времени - и ничего никуда преобразовывать будет не надо


не понял как юзать, попробовал так
select DATEADD(day, datediff(day, 0, EventDate), 0), count(*) from Sms 

group by DATEADD(day, datediff(day, 0, EventDate), 0)

вывел какую-то хрень...

как правильно?
4 ноя 09, 19:24    [7882211]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iljy
Member

Откуда:
Сообщений: 8711
CmeTanka

вывел какую-то хрень...

как правильно?


declare @t table(dt datetime)
insert into @t 
select '20090201' union all
select '20090301' union all
select '20090202' union all
select '20090203' union all
select '20090204' union all
select '20010505' union all
select '20040605' union all
select '20090705' 


select DATEADD(day, datediff(day, 0, dt), 0), count(*) from @t

group by DATEADD(day, datediff(day, 0, dt), 0)
что не так в выдаче?
4 ноя 09, 19:26    [7882219]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
iljy
Ozzy-Osbourne,

day - это как бы день месяца:) и от среды он не зависит;) день недели - datepart(dw, getdate())
ooops! пардон, в спешке напутал :-) Но всё равно не понятно, _что_ в итоге получить-то надо...
4 ноя 09, 19:26    [7882220]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
Ozzy-Osbourne
CmeTanka,


Функция day() возвращает номер дня, начиная с воскресенья (Вс=0).


DAY (Transact-SQL)
Returns an integer representing the day (day of the month) of the specified date.

Ж)

слепой кривого ведёт (с)народная мудрость

грубо говоря нужна просто группировка по СУТКАМ, чтоб никого не смущать.
4 ноя 09, 19:27    [7882223]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
iljy
CmeTanka

вывел какую-то хрень...

как правильно?


declare @t table(dt datetime)
insert into @t 
select '20090201' union all
select '20090301' union all
select '20090202' union all
select '20090203' union all
select '20090204' union all
select '20010505' union all
select '20040605' union all
select '20090705' 


select DATEADD(day, datediff(day, 0, dt), 0), count(*) from @t

group by DATEADD(day, datediff(day, 0, dt), 0)
что не так в выдаче?


гм, вроде правильно... проглядел чё-то....
пасиб
4 ноя 09, 19:31    [7882235]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iljy
Member

Откуда:
Сообщений: 8711
CmeTanka

грубо говоря нужна просто группировка по СУТКАМ, чтоб никого не смущать.

и? что не так делает этот запрос?
4 ноя 09, 19:31    [7882236]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
gvetas
Member

Откуда:
Сообщений: 4
Зачастую ответ находится в вопросе :
"вывести полную дату (т.е. месяц, год, число)"


SELECT
Cast(EventDate as Date) AS [Date],
Count(*) AS [Count]
FROM Sms
GROUP BY Cast(EventDate as Date)
6 ноя 09, 17:13    [7893746]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
gvetas
...Cast(EventDate as Date)...
CmeTanka
сервер SQL2005
6 ноя 09, 17:16    [7893764]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
gvetas
Member

Откуда:
Сообщений: 4
...Cast(EventDate as Date)...

to

convert(dateTime,convert(varchar(10),EventDate,104))
6 ноя 09, 18:01    [7894073]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по дням  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
gvetas
...Cast(EventDate as Date)...

to

convert(dateTime,convert(varchar(10),EventDate,104))
Списывать нехорошо!
6 ноя 09, 18:10    [7894143]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить