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

Откуда:
Сообщений: 13
Всем привет)

Не ругайте пожалуйста сильно - это мой первый пост и опыт в MS SQL незначителеный(

Подскажите пожалуйста. Есть таблицы T1 и T2.
В T1 содержится:
T1.ID - номер записи
T1.Id_name - ID имени - ключевое поле с T2.ID_name
T1.F - показатель (принимает значение 0 или 1 или NULL)
T1.S - показатеь (принимает значение 0 или 1 или NULL)
T1.T - показатель (принимает значение 0 или 1 или NULL)

В T2 содержится
T2.ID_name
T2.Name

Мне нужно написать селект, в результирующей выборке которого будет следующая инфа:

Имя (T2.name), количество записей где все показатели равны 0( F=0, S=0, T=0), количество записей, где хоть 1 показатель =1
с группировкой по T2.name
Я могу написать два разыных селекта, с группировкой по T2.name, но дело в том, что к некоторых записей T2.name показатели F S T могут быть NULL и две выборки получаются разными и неудобными для соединения вручную.

Select T2.name, count (distinct T1.ID)
FROM T1, T2
WHERE T1.F=0
and T1.S=0
and T1.T=0
GROUP BY T2.name
ORDER BY T2.name

А как добавить сюда еще выборку по F=1 or S=1 OR T=1?
24 янв 14, 11:29    [15461510]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
А как добавить сюда еще выборку по F=1 or S=1 OR T=1?

Используйте аггрегатную функцию с CASE внутри
24 янв 14, 11:30    [15461519]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

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

Спасибо)) все сделал, все получилось, очень круто)))
а возможно ли сделать, что например:
SELECT T2.name (case when T1.F = 1 THEN (тут поле T2.name должно получить приписку 'Бяка') ELSE T1.F = 0 (тут поле T2.name должно сохранить свое значение) END)
FROM T1, T2
??
24 янв 14, 17:07    [15464248]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
SELECT case when T1.F = 1 THEN 'Бяка' when T1.F = 0 THEN T2.name END as name
FROM T1, T2
24 янв 14, 17:09    [15464263]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

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

Если в боевом виде, то сам селект выглядит так:

SELECT cm.UserName (case when c.x74_with_agent= 'CB(C00.1)' THEN 'Бяка' when c.x74_with_agent='CB(C00.1)'
or c.x74_with_agent = 'nuull' THEN cm.UserName END) as cm.UserName
FROM
[***] as rd
LEFT JOIN [***] as c ON rd.x10_application_id = c.x10_application_id
LEFT JOIN [***] as cm on cm.application_id=rd.x10_application_id
LEFT JOIN [***] as ah on ah.application_id=rd.x10_application_id
LEFT JOIN [***] as st on st.application_id=rd.x10_application_id
LEFT JOIN [***] as pr on pr.id_product_code=rd.id_product_code
LEFT JOIN [***] as s on rd.SRS_ID = s.ID

Выдвет ошибку синтаксиса. но я так понимаю проблема в неверном написании самих условий( (((((
24 янв 14, 17:32    [15464386]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
Выдвет ошибку синтаксиса. но я так понимаю проблема в неверном написании самих условий( (((((

Нет. Что за cm.UserName перед case ?
24 янв 14, 17:33    [15464397]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

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

А это и есть то поле, в качестве аналогии которого я использовал T2.name в примерах выше.
Оно содержит различные имена, мне соответственно нужно,
в случае если c.x74_with_agent= 'CB(C00.1)' - то к этому полю что-то приставлялось(или заменяло значение поля, например на 'Бяка')
в случае если c.x74_with_agent= 'CB(C00.0)' или c.x74_with_agent= 'NULL' - то значение поля выводилост то, которое есть..
24 янв 14, 17:39    [15464422]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
А это и есть то поле, в качестве аналогии которого я использовал T2.name в примерах выше.

А в моем примере почему его нет перед case , как вы думаете ?
24 янв 14, 17:40    [15464436]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

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

хм, я убрал, но все равно ошибка (

SELECT case when c.x74_with_agent= 'CB(C00.1)' THEN 'Бяка' when c.x74_with_agent='CB(C00.0)'
THEN cm.UserName END as cm.UserName

FROM
[***] as rd
LEFT JOIN [***] as c ON rd.x10_application_id = c.x10_application_id
LEFT JOIN [***] as cm on cm.application_id=rd.x10_application_id
LEFT JOIN [***] as ah on ah.application_id=rd.x10_application_id
LEFT JOIN [***] as st on st.application_id=rd.x10_application_id
LEFT JOIN [***] as pr on pr.id_product_code=rd.id_product_code
LEFT JOIN [***] as s on rd.SRS_ID = s.ID

Ругается на ошибку "Неправильный синтаксис около конструкции "." cm.UserName"

Я не совсем понимаю, почему не указали. Еще плохо разбираюсь( Возможно, т.к. в условиях указано что возвращается?
24 янв 14, 17:48    [15464476]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
хм, я убрал, но все равно ошибка (

Еще раз внимательно рассмотрите пример.
Не надо его "улучшать".
24 янв 14, 17:49    [15464481]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

Откуда:
Сообщений: 13
Glory, спасибо большое. Видмо, моя невнимательность. Все получилось)

А подскажите, если я хочу к этому запросу добавить еще count, и сгруппировать по cm.UserName но ругается(

SELECT (case when c.x74_with_agent= 'CB(C00.1)' THEN 'Бяка' when c.x74_with_agent='CB(C00.0)' or c.x74_with_agent is null
THEN cm.UserName END) as Name
isnull (sum (CASE WHEN rd.x10_application_id > 1 THEN 1 ELSE 0 END),0) as 'Нямка'
FROM
[***] as rd
LEFT JOIN [***] as c ON rd.x10_application_id = c.x10_application_id
LEFT JOIN [***] as cm on cm.application_id=rd.x10_application_id
LEFT JOIN [***] as ah on ah.application_id=rd.x10_application_id
LEFT JOIN [***] as st on st.application_id=rd.x10_application_id
LEFT JOIN [***] as pr on pr.id_product_code=rd.id_product_code
LEFT JOIN [***] as s on rd.SRS_ID = s.ID
GROUP BY cm.UserName

Если не добавлять в селект cm.UserName то как по нему сгруппировать?
Ругается на Столбец "с.x74_with_agent" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
24 янв 14, 18:03    [15464567]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
Если не добавлять в селект cm.UserName то как по нему сгруппировать?

Никак. Нельзя группировать по полю, которого нет.
Упоминание поля таблицы в вычисляемом выражении, оставляет выражение выражением. А не делает из него поле таблицы.
24 янв 14, 18:07    [15464583]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

Откуда:
Сообщений: 13
Glory, спасибо, понял, получилось))

И.. еще вопросец.
есть столбец rd.x10_request_date > '01.06.2012' он в формате дд.мм.гг. Мне нужно бы выполнить группировку по дате в формате мм.гг(не просто перевести формат даты и группировать по этому полю, а именно группировка должна быть в формате мм.гг)..

Я думаю, нужно перевести формат и сгруппировать через DISTINCT это поле?
24 янв 14, 18:24    [15464659]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
Я думаю, нужно перевести формат и сгруппировать через DISTINCT это поле?

Не понял,но
- преобразования делаются функций CONVERT
- а группировка делается фразой GROUP BY
24 янв 14, 18:32    [15464697]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

Откуда:
Сообщений: 13
Glory
MS_SQL_WTF
Я думаю, нужно перевести формат и сгруппировать через DISTINCT это поле?

Не понял,но
- преобразования делаются функций CONVERT
- а группировка делается фразой GROUP BY


ммм. Как бы объяснить:
поле rd.x10_request_date содержит день, месяц и год ('dd.mm.yyyy'), можно сразу сгруппировать по этому полю, но выйдет группировка запроса по дням. А мне бы получить по неделям.

Что-то в виде:

SELECT
(case when c.x74_with_agent= 'CB(C00.1)' THEN 'Заявка от агента' when c.x74_with_agent='CB(C00.0)' or c.x74_with_agent is null


THEN cm.UserName END) as 'ФИО', convert(rd.x10_request_date, 'mm.yyy') as 'Дата',
isnull (sum (CASE WHEN rd.x10_application_id > 1 THEN 1 ELSE 0 END),0) as '1',
FROM
[***] as rd
LEFT JOIN [***] as c ON rd.x10_application_id = c.x10_application_id
LEFT JOIN [***] as cm on cm.application_id=rd.x10_application_id
LEFT JOIN [***] as ah on ah.application_id=rd.x10_application_id
LEFT JOIN [***] as st on st.application_id=rd.x10_application_id
LEFT JOIN [***] as pr on pr.id_product_code=rd.id_product_code
LEFT JOIN [***] as s on rd.SRS_ID = s.ID
WHERE
rd.x10_request_date > '01.06.2012'
GROUP BY
(case when c.x74_with_agent= 'CB(C00.1)' THEN 'Бяка' when c.x74_with_agent='CB(C00.0)' or c.x74_with_agent is null
THEN cm.UserName END),
convert(rd.x10_request_date, 'mm.yyy')

но не выходит. Ошибка Тип rd.x10_request_date не является определенным системным типом ((
24 янв 14, 18:45    [15464766]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
Glory
Member

Откуда:
Сообщений: 104760
MS_SQL_WTF
но не выходит. Ошибка Тип rd.x10_request_date не является определенным системным типом ((

А почитать в хелпе про функцию convert что помешало ?
24 янв 14, 18:46    [15464772]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

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

хелп тут на форуме? или в клиенте?
24 янв 14, 18:55    [15464815]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
o-o
Guest
Glory
MS_SQL_WTF
но не выходит. Ошибка Тип rd.x10_request_date не является определенным системным типом ((

А почитать в хелпе про функцию convert что помешало ?

может посмотрел, да забыл. пятница :)
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
24 янв 14, 18:58    [15464832]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
MS_SQL_WTF
Member

Откуда:
Сообщений: 13
o-o
Glory
пропущено...

А почитать в хелпе про функцию convert что помешало ?

может посмотрел, да забыл. пятница :)
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )


data_type - тут нужно указать формат даты в котором нужно вывести?
( length ) - как я понимаю поле с датой
, style - вид в котором нужно вывести?

Я не понимаю((

А вариант сделать так:
CONVERT(DATETIME, STR(@Year))?
24 янв 14, 19:07    [15464856]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
o-o
Guest
MS_SQL_WTF,
Glory был прав.
help -- это вот такое:
CAST and CONVERT (Transact-SQL)
24 янв 14, 19:22    [15464907]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL несколько count'ов  [new]
iap
Member

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

читайте всё вот тут: http://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.100).aspx
24 янв 14, 19:27    [15464922]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить