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

Откуда: Стольный
Сообщений: 4
Добрый день!
Есть задача такого рода:

Есть таблица t1
у нее колонки типа DateTime, int
DateTime содержит данные вида: 05.09.2011 17:06:06
Теперь цель:
Надо выбрать количество count() всех записей по месяцу\году\дню
Задача выводить ИД - не ставится. Надо чтобы вывод запроса имел вид:


(ДАТА) (СУМ)
07-2011 540
08-2011 1120
итд

Написал часть запросов но не чето не получается их связать

select distinct RIGHT(CONVERT(VARCHAR(10), date, 105), 7) as d from t1 (вывод дат)
SELECT count(*) from t1 where RIGHT(CONVERT(VARCHAR(10), date, 105), 7) = '08-2011' (вывод суммы за месяц)


Как их связать, чтобы все в одной таблице выполнялось?:(

Заранее большое спасибо за посильную подсказку!
21 сен 11, 10:00    [11309681]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iljy
Member

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

используйте GROUP BY. Возможно с WITH ROLLUP
21 сен 11, 10:02    [11309691]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
rigus
Member

Откуда: Сургут
Сообщений: 349
--День
select dateadd(day,datediff(day,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(day,0,data),0)
where data=dateadd(day,datediff(day,0,data),0)='2011-09-21'
--Месяц
select dateadd(day,datediff(month,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(month,0,data),0)
where data=dateadd(day,datediff(month,0,data),0)='2011-09-01'
--Год
select dateadd(day,datediff(year,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(year,0,data),0)
where data=dateadd(day,datediff(year,0,data),0)='2011-01-01'
Примерно так если нужно по конкретному месяцу,дню или году если по всем то убрараешь условие
21 сен 11, 10:30    [11309868]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
rigus
--День
select dateadd(day,datediff(day,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(day,0,data),0)
where data=dateadd(day,datediff(day,0,data),0)='2011-09-21'
--Месяц
select dateadd(day,datediff(month,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(month,0,data),0)
where data=dateadd(day,datediff(month,0,data),0)='2011-09-01'
--Год
select dateadd(day,datediff(year,0,data),0) ,count(*) from t1 group by dateadd(day,datediff(year,0,data),0)
where data=dateadd(day,datediff(year,0,data),0)='2011-01-01'
Примерно так если нужно по конкретному месяцу,дню или году если по всем то убрараешь условие
А что это за синтаксис?
where data=dateadd(day,datediff(year,0,data),0)='2011-01-01'
21 сен 11, 10:38    [11309911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
rigus
Member

Откуда: Сургут
Сообщений: 349
Не тестировал :) Опечатался.. data= -лишнее....
21 сен 11, 10:41    [11309921]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
rigus
Не тестировал :) Опечатался.. data= -лишнее....
А что должно быть раньше - GROUP BY или WHERE?
И индекс по [data] Вы за что-то не любите...
21 сен 11, 10:47    [11309949]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
rigus
Member

Откуда: Сургут
Сообщений: 349
Вы правы.
Набирал в блокноте :-( и уловие скопипастил
по индексу не ясно вообще есть ли он в табице по этому полю.
21 сен 11, 10:53    [11309982]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
amatvienko
Member

Откуда: Стольный
Сообщений: 4
спасибо за ответы:-), iljy - за тычок ;-)

То решение запроса, которое мне подошло такое:

select distinct left(CONVERT(varchar(20), date, 102), 7) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 7) - по месяцам в году

select distinct left(CONVERT(varchar(20), date, 102), 10) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 10) - по дням в году

select distinct left(CONVERT(varchar(20), date, 102), 4) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 4) - по годам
21 сен 11, 10:57    [11310020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
amatvienko
Member

Откуда: Стольный
Сообщений: 4
вот, к стати, не плохая инструкция
http: // www . sql-server-helper.com / tips / date-formats.aspx
21 сен 11, 11:01    [11310054]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
rigus
Вы правы.
Набирал в блокноте :-( и уловие скопипастил
по индексу не ясно вообще есть ли он в табице по этому полю.
Ну а если и нет!
Вот решит, что надо - и сделает!
И все запросы переписывать?
Почему бы сразу правильно не написать?
--День
select dateadd(day, datediff(day,0,data),0), count(*)
from t1
where data>='20110921' and data<'20110922'
group by dateadd(day, datediff(day,0,data),0);
--Месяц
select dateadd(day, datediff(month,0,data),0), count(*)
from t1
where data>='20110901' and data<'20111001'
group by dateadd(day, datediff(month,0,data),0);
--Год
select dateadd(day, datediff(year,0,data),0), count(*)
from t1
where data>='2011' and data<'2012'
group by dateadd(day, datediff(year,0,data),0);
21 сен 11, 11:04    [11310076]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
amatvienko
спасибо за ответы:-), iljy - за тычок ;-)

То решение запроса, которое мне подошло такое:

select distinct left(CONVERT(varchar(20), date, 102), 7) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 7) - по месяцам в году

select distinct left(CONVERT(varchar(20), date, 102), 10) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 10) - по дням в году

select distinct left(CONVERT(varchar(20), date, 102), 4) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 4) - по годам
И зачем же там DISTINCT, интересно?!
При живом-то GROUP BY!!!
21 сен 11, 11:06    [11310088]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
amatvienko
спасибо за ответы:-), iljy - за тычок ;-)

То решение запроса, которое мне подошло такое:

select distinct left(CONVERT(varchar(20), date, 102), 7) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 7) - по месяцам в году

select distinct left(CONVERT(varchar(20), date, 102), 10) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 10) - по дням в году

select distinct left(CONVERT(varchar(20), date, 102), 4) as d, count(*) as c from sr
group by left(CONVERT(varchar(20), date, 102), 4) - по годам
left и distinct лишние, короче нужно писать:
select CONVERT(varchar(7), date, 102) as d, count(*) as c from sr
group by CONVERT(varchar(7), date, 102) - по месяцам в году

select CONVERT(varchar(10), date, 102) as d, count(*) as c from sr
group by CONVERT(varchar(10), date, 102) - по дням в году

select CONVERT(varchar(4), date, 102) as d, count(*) as c from sr
group by CONVERT(varchar(4), date, 102) - по годам 
21 сен 11, 11:11    [11310134]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
iljy
Member

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

только я бы не convert использовал, а DATEDIFF, соответственно DATEDIFF(d,0,date), DATEDIFF(mm,0,date), DATEDIFF(yy,0,date), не люблю со строками лишний раз работать, больно там быстродействие начинает проседать.
21 сен 11, 11:39    [11310336]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с составлением запроса  [new]
amatvienko
Member

Откуда: Стольный
Сообщений: 4
К сож. я не гуру :( я только учусь. Спасибо за ответы всем!!! Рад, что здесь мне быстро помогли.
21 сен 11, 13:36    [11311636]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить