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

Откуда:
Сообщений: 298
Например, есть запрос, который выбирает встречающееся в title слово Утро:
SELECT id_tv, start, channel, title, date FROM  tv where channel like '%'
AND title like '%Утро%'
Результат:
07:00:00.0	MTV	Стерео_утро	2011-08-15
07:00:00.0	MTV	Стерео_утро	2011-08-16
07:00:00.0	MTV	Стерео_утро	2011-08-17
07:00:00.0	MTV	Стерео_утро	2011-08-18
05:05:00.0	1TV	Телеканал "Доброе утро"	2011-08-15
05:05:00.0	1TV	Телеканал "Доброе утро"	2011-08-16
05:05:00.0	1TV	Телеканал "Доброе утро"	2011-08-17
06:00:00.0	NTV	НТВ утром	2011-08-15
06:00:00.0	NTV	НТВ утром	2011-08-16
06:00:00.0	NTV	НТВ утром	2011-08-17
А как можно организовать тот же запрос с результатом:

07:00:00.0	MTV	Стерео_утро	2011-08-15, 2011-08-16, 2011-08-17, 2011-08-18
05:05:00.0	1TV	Телеканал "Доброе утро"	2011-08-15, 2011-08-16, 2011-08-17
06:00:00.0	NTV	НТВ утром	2011-08-15, 2011-08-16, 2011-08-17
Возможно ли такое?
23 авг 11, 13:45    [11163768]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/faq/faq_topic.aspx?fid=130

https://www.sql.ru/faq/faq_topic.aspx?fid=731

Сообщение было отредактировано: 23 авг 11, 13:49
23 авг 11, 13:49    [11163821]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend,

channel like '%'
можно записать проще
channel IS NOT NULL
Правда, не понял, зачем это вообще нужно.
Подозреваю, что channel не бывает NULL?
23 авг 11, 14:49    [11164521]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap,
через
channel like '%'
выбираю иногда нужные каналы.
23 авг 11, 16:03    [11165360]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
Пробовал так:
SELECT  channel, [Описание1]= ( select cast(date as nvarchar)+ ', '  from tv  where title like '%Утро%'
and channel=t.[channel] for xml path('') )
from dbo.tv t 
  where (channel like '%')
AND title like '%Утро%' 
group by channel
Выводит следующее:
1TV	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, 
MTV	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, Aug 27 2011 12:00AM, Aug 28 2011 12:00AM, 
NTV	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, 
Примерно похоже, что надо, но никак не могу вывести ещё колонку title, где встречается слово утро, т.е. вот так:

1TV	Стерео_утро	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, 
MTV  	Телеканал "Доброе утро"	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, Aug 27 2011 12:00AM, Aug 28 2011 12:00AM, 
NTV	НТВ утром	Aug 22 2011 12:00AM, Aug 23 2011 12:00AM, Aug 24 2011 12:00AM, Aug 25 2011 12:00AM, Aug 26 2011 12:00AM, 
Да и колонку со временем тоже не получается вставить, как в первом посте ...
23 авг 11, 16:10    [11165448]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend,

start=MIN(start),title=MIN(title)
??
23 авг 11, 16:17    [11165518]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Scend,

start=MIN(start),title=MIN(title)
??
Хотя, стоп!
Вам, небось, надо просто start добавить в SELECT и start - в GROUP BY?
Если разные каналы могут стартовать несколько раз в день в разное время?
23 авг 11, 16:19    [11165547]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap, о
спасибо!
Что странно, до этого тоже добавлял start в селект и GROUP BY, но, почему-то ничего не группировалось.
Сейчас все сработало.

Ещё хочу спросить, а можно вот это
cast(date as nvarchar)
сделать вот так
cast(date as datetime)
?
23 авг 11, 16:28    [11165657]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend
iap, о
спасибо!
Что странно, до этого тоже добавлял start в селект и GROUP BY, но, почему-то ничего не группировалось.
Сейчас все сработало.

Ещё хочу спросить, а можно вот это
cast(date as nvarchar)
сделать вот так
cast(date as datetime)
?
А какого типа date?
23 авг 11, 16:44    [11165805]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap
Scend

Ещё хочу спросить, а можно вот это
cast(date as nvarchar)
сделать вот так
cast(date as datetime)
?
А какого типа date?

smalldatetime
Хочу вместо
Aug 22 2011 12:00AM
выводить
2011-08-22
А также, если возможно вывести просто день недели
Понедельник
23 авг 11, 16:50    [11165852]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend
iap
пропущено...
А какого типа date?

smalldatetime
Хочу вместо
Aug 22 2011 12:00AM
выводить
2011-08-22
А также, если возможно вывести просто день недели
Понедельник
Тогда это не CAST требуется, а CONVERT с третьим параметрам.
День недели - SET LANGUAGE русский (перед запросом), а в SELECTе - DATENAME соответствующий
23 авг 11, 16:54    [11165891]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap
День недели - SET LANGUAGE русский (перед запросом), а в SELECTе - DATENAME соответствующий

Для пробы сделал так
select convert(smalldatetime,convert(char(4),year(date)),101)
Но, ругается
Преобразование типа данных varchar в тип данных smalldatetime привело к выходу значения за пределы диапазона.
23 авг 11, 17:47    [11166360]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Scend
Для пробы сделал так
select convert(smalldatetime,convert(char(4),year(date)),101)

И в какую дату по-вашему сервер должен преобразовать строку '2011' ?
23 авг 11, 17:49    [11166387]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
Сделал так
select convert(varchar(32), date, 101)
Выводит
08/22/2011, 08/23/2011, 08/24/2011, 08/25/2011, 08/26/2011,

Осталось научиться выводит дни недели.
23 авг 11, 17:59    [11166495]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
Scend

Осталось научиться выводит дни недели.

А есть такая возможность? Что-то не нашел такой параметр.
23 авг 11, 18:18    [11166636]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
Всё таки нашел параметры:

convert(varchar(16), DATENAME(weekday,date)
23 авг 11, 20:07    [11167207]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
Scend
Для пробы сделал так
select convert(smalldatetime,convert(char(4),year(date)),101)

И в какую дату по-вашему сервер должен преобразовать строку '2011' ?
Строка '2011' соответствует 1 января 2011 года
Строковый формат без разделителей
Строка только из четырех разрядов интерпретируется как год.
Число и месяц принимают значение 1 января.
В четырехразрядном формате всегда указывайте столетие.

http://msdn.microsoft.com/ru-ru/library/ms180878(v=SQL.100).aspx#UnseparatedStringFormat
23 авг 11, 20:35    [11167341]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend
Всё таки нашел параметры:

convert(varchar(16), DATENAME(weekday,date)
Зачем здесь CONVERT?
23 авг 11, 20:36    [11167345]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap, спасибо, исправил.
Вот последний вариант:
SET LANGUAGE русский
SELECT  channel, start,title, [Coldate]= ( select ( DATENAME(WEEKDAY,date))+ ', '  from tv  where title like '%День%'
and title=t.[title] for xml path('') )
from dbo.tv t 
  where (channel like '%')
AND title like '%День%' 
group by title, channel, start
Остался маленький штрих, как убрать запятую в конце?
ORT	08:05:00.0	День аиста	суббота, 
KUL	04:30:00.0	День первый	суббота,воскресенье, 
24 авг 11, 10:01    [11169083]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend
iap, спасибо, исправил.
Вот последний вариант:
SET LANGUAGE русский
SELECT  channel, start,title, [Coldate]= ( select ( DATENAME(WEEKDAY,date))+ ', '  from tv  where title like '%День%'
and title=t.[title] for xml path('') )
from dbo.tv t 
  where (channel like '%')
AND title like '%День%' 
group by title, channel, start
Остался маленький штрих, как убрать запятую в конце?
ORT	08:05:00.0	День аиста	суббота, 
KUL	04:30:00.0	День первый	суббота,воскресенье, 
SET LANGUAGE русский
SELECT  channel, start,title, [Coldate]=STUFF((select ', '+DATENAME(WEEKDAY,date) from tv  where title like '%День%'
and title=t.[title] for xml path('') ),1,2,'')
from dbo.tv t 
  where channel like '%'
AND title like '%День%' 
group by title, channel, start
24 авг 11, 10:26    [11169220]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
Scend
Member

Откуда:
Сообщений: 298
iap, спасибо, работает.
А средствами DATENAME можно выводить сокращенный день недели?
Пн, Вт, Ср, Чт, Пт, Сб, Вс?
24 авг 11, 11:22    [11169651]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с группировкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Scend
iap, спасибо, работает.
А средствами DATENAME можно выводить сокращенный день недели?
Пн, Вт, Ср, Чт, Пт, Сб, Вс?
А что Вам мешает
1) пойти в BOL, наконец, и всё там узнать?
2) Создать таблицу с днями недели или вставитьь CASE в SELECT для превращения дня недели в любую строку,
которую душа пожелает?
Их всего-то 7 (!!!)
24 авг 11, 13:17    [11170793]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить