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

Откуда: Украина, Киев-Одесса
Сообщений: 182
Добрый день, Уважаемые форумчане

По задаче, имеется таблица со списком договоров, клиентов и видов.
По одному клиенту может быть несколько договоров с разными видами.
Вот и задача получить количество случаев, при которых по одному клиенту несколько разных видов
Написал запрос. Может кто подскажет, насколько он верный

select  ab2 , ab3 ,count (distinct номердоговора)
       FROM [123].[dbo].[76]
	   WHERE   ([DatePosting] >= '20130101' and [DatePosting] < '20140201') 
	   group by ab2 , ab3
	   having  count (клиент) = 1 and count (distinct вид) > 1
4 мар 14, 19:03    [15672148]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Этим запросом Вы оставляете только тех клиентов для которых существует единственная запись в базе.
4 мар 14, 19:27    [15672250]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
В пределах группы, конечно. Так и задумано?
4 мар 14, 19:30    [15672263]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Владислав Колосов
Этим запросом Вы оставляете только тех клиентов для которых существует единственная запись в базе.

а поскольку по одному клиенту договоров с разными видами может быть 2, соответственно и количество клиентов он подсчитает как 2..?
иными словами, нужно для каждого клиента сверить количество разных видов, и если таких больше 1, то защитать 1 случай.
Я вот только что подумал про case.
case when {для каждого клиента} count (distinct Вид) > 1 then 1 else 0
как правильно прописать {для каждого клиента} ?
4 мар 14, 19:42    [15672316]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Если добавить в услвие группировки клиента, то как раз получите список тех клиентов, для которых разновидностей договоров больше 1.
select  ab2 , ab3 ,  [клиент], count (distinct номердоговора)  [общее_количество_договоров]
       FROM [123].[dbo].[76]
	   WHERE   ([DatePosting] >= '20130101' and [DatePosting] < '20140201') 
	   group by ab2 , ab3, [клиент]
	   having  count (distinct вид) > 1 

Какой смысл имеют ab2 и ab3 непонятно, возможно это подразделения.
4 мар 14, 19:53    [15672370]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Владислав Колосов
Если добавить в услвие группировки клиента, то как раз получите список тех клиентов, для которых разновидностей договоров больше 1.
select  ab2 , ab3 ,  [клиент], count (distinct номердоговора)  [общее_количество_договоров]
       FROM [123].[dbo].[76]
	   WHERE   ([DatePosting] >= '20130101' and [DatePosting] < '20140201') 
	   group by ab2 , ab3, [клиент]
	   having  count (distinct вид) > 1 

Какой смысл имеют ab2 и ab3 непонятно, возможно это подразделения.


Да, это действительно подразделения. Спасибо Владислав
В условиях подсчета указан distinct --count (distinct номердоговора)-- поскольку по каждому договору может быть несколько записей, например в связи с расрочкой.
В нашей ситуации это не помешает правильным результатам?
4 мар 14, 20:03    [15672421]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
count (distinct номердоговора) даст количество уникальных договоров для тех клиентов, у которых более одного варианта. distinct не нужен, если номера в пределах группировки не дублируются. Т.е. дистинкт нужен, если один и тот же договор по каким-то причинам в выборке присутствует несколько раз.
4 мар 14, 21:22    [15672750]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Владислав Колосов
count (distinct номердоговора) даст количество уникальных договоров для тех клиентов, у которых более одного варианта. distinct не нужен, если номера в пределах группировки не дублируются. Т.е. дистинкт нужен, если один и тот же договор по каким-то причинам в выборке присутствует несколько раз.


в выборке один договор может быть указан несколько раз, если по нему была рассрочка.
тогда distinct в данном запросе нужен.

Еще раз Большое Спасибо, Владислав
5 мар 14, 10:26    [15674595]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Сегодня появилось время потестировать запрос
Выяснил что результат запроса получается не верный

Имеется таблица:

номер договора вид клиент
11111 вид_кредитка Иванов ИИ
11112 вид_универсальная Петров ПП


Есть запрос
select клиент, count (distinct номердоговора)  
       FROM [123].[dbo].[76]
	   group by клиент
	   having  count (distinct вид) > 1


Насколько я понял, этот запрос возвращает полный список договоров по тем вида, которые встречаются в глобальной таблице больше одного раза, а не те, которые встречаются по конкретному клиенту больше одного раза

По задаче, нужно вывести количество тех договоров, когда по одному клиенту оформлено два и больше видов
Может будут у кого-то идеи
11 мар 14, 12:16    [15703423]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
Glory
Member

Откуда:
Сообщений: 104751
googlogmob
Насколько я понял, этот запрос возвращает полный список договоров по тем вида, которые встречаются в глобальной таблице больше одного раза, а не те, которые встречаются по конкретному клиенту больше одного раза

Вы неправильно поняли.
Агрегаты в having вычисляются в области условия группировки, а не всей таблицы.
11 мар 14, 12:21    [15703477]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на количество случаев  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Glory
googlogmob
Насколько я понял, этот запрос возвращает полный список договоров по тем вида, которые встречаются в глобальной таблице больше одного раза, а не те, которые встречаются по конкретному клиенту больше одного раза

Вы неправильно поняли.
Агрегаты в having вычисляются в области условия группировки, а не всей таблицы.


понедельник..
Конечно, Вы правы
11 мар 14, 13:36    [15704149]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить