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

Откуда:
Сообщений: 271
Написал запрос, который должен выгрузить список клиентов и договоров, если по клиенту было свыше 19 договоров
Но почему-то режет условие having count(t.contractnumber)>=20. Подозреваю, что select нужно указать иначе
Как правильно изложить запрос?

  select  z.Client,z.ContractNumber, m.SumPaymentTotal, m.DateContract, m.DateBegin
  from(
  SELECT  t.Client,t.ContractNumber
     FROM [data].[dbo].[76] t
    group by t.Client,t.ContractNumber
	having count(t.contractnumber)>=20
	) as z
	left join [data].[dbo].[76] m on m.ContractNumber=z.ContractNumber
	group by z.Client,z.ContractNumber, m.SumPaymentTotal, m.DateContract, m.DateBegin
26 янв 15, 16:35    [17172062]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
если по клиенту было свыше 19 договоров

И как интересно можно посчитать число договоров с группировкой по номеру договора - group by t.Client,t.ContractNumber ?
26 янв 15, 16:45    [17172132]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

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

  select  z.Client,z.ContractNumber, m.SumPaymentTotal, m.DateContract, m.DateBegin
  from(
  SELECT  t.Client
     FROM [data].[dbo].[76] t
    group by t.Client
	having count(t.contractnumber)>=20
	) as z
	left join [data].[dbo].[76] m on m.ContractNumber=z.ContractNumber
	group by z.Client,z.ContractNumber, m.SumPaymentTotal, m.DateContract, m.DateBegin
26 янв 15, 16:57    [17172241]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
в таблице значение номера договора в поле t.ContractNumber может быть указано более одного раза (если было больше одной проводки)
Следует ли в таком случае в count добавить distinct:
having count(distinct t.contractnumber)>=20
26 янв 15, 16:59    [17172272]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Glory, так?

Зачем еще group by z.Client,z.ContractNumber, m.SumPaymentTotal, m.DateContract, m.DateBegin ?
Почему left join ?
26 янв 15, 17:10    [17172347]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

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

group by убрал. на автомате дописал
разве без join можно обойтись?
26 янв 15, 17:23    [17172447]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
разве без join можно обойтись?

Вопрос был почему left join. А не почему join
26 янв 15, 17:27    [17172477]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
MrMuscul
Member

Откуда:
Сообщений: 114
SELECT q.clientid,
       q.contractnumber,
       q.sumpaymenttotal,
       q.datecontract,
       q.datebegin
  FROM [data].[dbo].[76] q
 inner join (SELECT q2.clientid
               FROM [data].[dbo].[76] q2
              group by clientid
             having count(distinct contractnumber) > 19) q2
    on q.clientid = q2.clientid
26 янв 15, 17:36    [17172551]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Спасибо за вариант
Переписал на:
  select  z.Client,z.ContractNumber, z.SumPaymentTotal, z.DateContract, z.DateBegin
  from [data].[dbo].[76] z
  inner join (
  SELECT  Client
     FROM [Cdata].[dbo].[76]
    group by Client
	having count(distinct contractnumber)>=20
	)as m  on m.Client=z.Client
		 where z.DateContract between '20140101' and '20141231'  
		and  z.[(Yur/Phis)] = N'Юр'
		and z.vid = N'КАРТА'


Выгружается не верно (не срабатывает фильтр having count..)
джойнить нужно по номеру договора, иначе подтягиваются "лишние" договора. Но чтобы это реализовать, придется добавить поле "ContractNumber" в подзапрос, и в последствии having count будет полностью резать результат
Какой-то замкнутый круг.
ПС. я выгрузил весь список договоров в ексель и в сводной отфильтровал по резутату >19. Но все-таки хотелось бы понять, как реализовать это на уровне sql
26 янв 15, 18:14    [17172849]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
MrMuscul
Member

Откуда:
Сообщений: 114
2viper2viper,

А если такой вариант?
SELECT q1.clientid,
       q1.contractnumber,
       q1.sumpaymenttotal,
       q1.datecontract,
       q1.datebegin
  FROM [data].[dbo].[76] q1
 cross apply (SELECT q2.clientid
                FROM [data].[dbo].[76] q2
               where q2.clientid = q1.clientid
               group by clientid
              having count(distinct contractnumber) > 19) q2
26 янв 15, 18:26    [17172903]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
MrMuscul
Member

Откуда:
Сообщений: 114
Туплю, разницы то нет :)
26 янв 15, 18:28    [17172911]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
MrMuscul
Member

Откуда:
Сообщений: 114
2viper2viper,

Так вроде так как надо. Всех договора клиента, если у него их больше 19. Или может на конкретных данных покажите что не так?
26 янв 15, 18:42    [17172981]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Выгружается не верно (не срабатывает фильтр having count..)

Это вы по результатам запроса
SELECT Client
FROM [Cdata].[dbo].[76]
group by Client
having count(distinct contractnumber)>=20
установили ?
Или просто так решили ?
26 янв 15, 20:10    [17173377]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
Выгружается не верно (не срабатывает фильтр having count..)

Это вы по результатам запроса
SELECT Client
FROM [Cdata].[dbo].[76]
group by Client
having count(distinct contractnumber)>=20
установили ?
Или просто так решили ?

По результатам запроса - выгрузились все клиенты, даже те, у которых было меньше 20 договоров
Здесь нужно не по клиенту связывать, а по договору как-то, потому что не все договора участвуют в выборке (отбираются только определенного вида). но если по договору, то его нужно добавить в select, а тогда count не работает..
31 янв 15, 14:00    [17200111]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
режет условие
Guest
2viper2viper
потому что не все договора участвуют в выборке (отбираются только определенного вида). но если по договору, то его нужно добавить в select, а тогда count не работает..

это делается через WHERE, и в select ничего добавлять не нужно

а вообще, тут https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.6. хороший совет для "вопрошающих" с "терминологией" типа "режет условие" и "изложить запрос"
31 янв 15, 14:20    [17200188]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
режет условие
2viper2viper
потому что не все договора участвуют в выборке (отбираются только определенного вида). но если по договору, то его нужно добавить в select, а тогда count не работает..

это делается через WHERE, и в select ничего добавлять не нужно

а вообще, тут https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.6. хороший совет для "вопрошающих" с "терминологией" типа "режет условие" и "изложить запрос"


мы наверное говорим на разных языках. я об этом:

К сообщению приложен файл. Размер - 62Kb
31 янв 15, 15:09    [17200406]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
режет условие
Guest
2viper2viper
режет условие
пропущено...

это делается через WHERE, и в select ничего добавлять не нужно

а вообще, тут https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.6. хороший совет для "вопрошающих" с "терминологией" типа "режет условие" и "изложить запрос"


мы наверное говорим на разных языках. я об этом:
да, @$%#@% !!1

режет условие
а вообще, тут https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.6. хороший совет для "вопрошающих" с "терминологией" типа "режет условие" и "изложить запрос"


автор
Написал запрос, который должен выгрузить список клиентов и договоров, если по клиенту было свыше 19 договоров

это ж каким нужно быть @$%#@%, что бы код выкладывать картинками !!
select  z.Client,z.ContractNumber, z.SumPaymentTotal, z.DateContract, z.DateBegin
  from [data].[dbo].[76] z
  inner join [Cdata].[dbo].[76] m
 on m.Client=z.Client
where z.DateContract between '20140101' and '20141231'  
		and  z.[(Yur/Phis)] = N'Юр'
		and z.vid = N'КАРТА'
and (select count(z1.ContractNumber) from [data].[dbo].[76] z1 where z1.DateContract between '20140101' and '20141231'  
		and  z1.[(Yur/Phis)] = N'Юр'
		and z1.vid = N'КАРТА' 
		and z1.Client=z.Client)>19
31 янв 15, 16:08    [17200673]     Ответить | Цитировать Сообщить модератору
 Re: запрос с having  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Да, спасибо. выгружается верно

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

подправил запрос

select  z.Client,z.ContractNumber, z.SumPaymentTotal, z.DateContract, z.DateBegin
  from [data].[dbo].[76] z
where z.DateContract between '20140101' and '20141231'  
		and  z.[(Yur/Phis)] = N'Юр'
		and z.vid = N'КАРТА'
and (select count(z1.ContractNumber) from [data].[dbo].[76] z1 where z1.DateContract between '20140101' and '20141231'  
		and  z1.[(Yur/Phis)] = N'Юр'
		and z1.vid = N'КАРТА' 
		and z1.Client=z.Client)>19
31 янв 15, 17:10    [17200905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить