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

Откуда:
Сообщений: 17
Доброго времени суток. Бьюсь уже с этим запросом второй день. До этого юзал MySQL, и как мне кажется такие проблемы там решал на раз, но здесь не получается.

Задача:
Есть некая таблица со страховыми полисами. В этой таблице есть куча колонок, но нас интересует только 2, это ID, и ключ путевки.
Задача: при выборке из этой таблицы выбрать все полисы, но что бы ключ путевки был уникальный.
Т.е. к примеру у нас может быть что к одной путевке прикреплено более одного полиса. Необходимо что бы при выборке я получил только последний полис.

К сожалению приходится работать с имещимся продуктом, который накладывает многие ограничения. Сейчас там трудится вот такой SQL запрос:

select ip_policynumber, ip_createdate,ip_datebeg,ip_dateend
		,ip_jurname,ip_premium = ip_premium/(select count(*) from insturists where it_ipid = ip_id),
		ip_id,ip_comment,it_birthday,ip_jurfullname,
		ip_jurinn,ip_annuldate,it_name,it_fname
		from inspolicy 
		join insturists on it_ipid = ip_id
		where ip_id in (44991, 45037, 45117, 45118, 45119, 45120)


Где значение ip_id in() подставляется из программы и расчитывается какой то нездоровой логикой которую я править не могу.
Соответсвенно этот запрос ничего не групирует и не отсеивает. И если есть несколько полисов на одну путевку, то он их выведет.

В это запросе полисы джойнятся с туристами и на выходе мы получаем количство строк равное полис*количество туристов в нем.

Соответственно этот запрос нужно переделать по задаче выше.
Я пробовал использовать Group by, вложеные запросы, distinct, но все это не то + я не умею этим пользоваться в достаточной мере.
В mysql помоему это решалось с помощью group by, но MSSQL непозволяет групировать и оставлять те поля которые не входят в групировку и не используют агрегатных функций.

Distinсt тоже работает только с одним полем, и если я при выборке хочу что бы ко мне вернулось 2 столбца - не сработает.

Пробоовал по советам из гугла сделать что то вроде этого:

	select f.* from 
	(select ip_id, max(ip_createdate) as maxdate from inspolicy group by ip_id) as d
	INNER join (
		select ip_policynumber, ip_createdate,ip_datebeg,ip_dateend
		,ip_jurname,ip_premium = ip_premium/(select count(*) from insturists where it_ipid = ip_id),
		ip_id,ip_comment,it_birthday,ip_jurfullname,
		ip_jurinn,ip_annuldate,it_name,it_fname
		from inspolicy 
		join insturists on it_ipid = ip_id
		where ip_id in (44991, 45037, 45117, 45118, 45119, 45120)
	) as f 
		
		ON d.ip_id = f.ip_id AND d.maxdate = f.ip_createdate


Но получил ерунду, потому что написал какой то бред. Так к примеру в этом запросе вообще не участвует самое важное поле IP_DLKey (ключ путевки по которому надо сгруппировать). Но если я сгрупирую по этому полю, то я уже не могу выбрать ip_id, и соответсвенно сджойнить по нему.

Помогите пожалуйста.
5 сен 12, 10:14    [13115552]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
thekip
Т.е. к примеру у нас может быть что к одной путевке прикреплено более одного полиса. Необходимо что бы при выборке я получил только последний полис.

А что определяет, что полис "последний" ?
thekip
но MSSQL непозволяет групировать и оставлять те поля которые не входят в групировку и не используют агрегатных функций.

Вы же сам сказали "В этой таблице есть куча колонок, но нас интересует только 2, это ID, и ключ путевки."
Откуда тогда в запросе появилось больше полей ?
5 сен 12, 10:23    [13115596]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
Добрый Э - Эх
Guest
thekip, читать тут, до полного просветления
5 сен 12, 10:32    [13115672]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
thekip
Member

Откуда:
Сообщений: 17
Glory
А что определяет, что полис "последний" ?


Дата создания max(ip_createdate) as maxdate

Glory
Вы же сам сказали "В этой таблице есть куча колонок, но нас интересует только 2, это ID, и ключ путевки."
Откуда тогда в запросе появилось больше полей ?


"Нас" - это нас с вами, участником форума разбирающих этот вопрос. Так как эти 2 колонки ключевые здесь.
А для бизнес задачи нужны все те колонки что перечислены в запросе.

Добрый Э - Эх

Сейчас почитаю. Спасибо.
5 сен 12, 10:39    [13115741]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
thekip
Member

Откуда:
Сообщений: 17
Добрый Э - Эх
thekip, читать тут, до полного просветления


Вообщем полного просветления не достиг. Как оказалось в своем вариант выше я пробовал 3 вариант из того топика:

select t1.*
  from [Таблица] t1,
       (
         select [Клиент], max([Дата]) as [Дата]
           from [Таблица]
          group by [Клиент]
       ) v
 where t1.[Клиент] = v.[Клиент]
   and t1.[Дата] = v.[Дата];


И он вроде даже сулит какую то надежду, но у меня есть неразрешенный вопрос, в данном случае они группируют по "Клиент". В моем случае это номер путевки (IP_DLKey). Но мне нужно что бы внутренний подзапрос вовзращал primary key полисов, а не ключ путевки. Т.к. если я сджойню с ключом путевки у меня будет тот же самый результат.
5 сен 12, 11:00    [13115905]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
thekip
Member

Откуда:
Сообщений: 17
Эм... щас попробвал сделать еще раз. Воперки собственным предубежденям...
Вообщем я не понимаю как, но оно работает:

	select f.* from 
	(select IP_DLKey, max(ip_createdate) as maxdate from inspolicy group by IP_DLKey) as d
	INNER join (
		select IP_DLKey, ip_policynumber, ip_createdate,ip_datebeg,ip_dateend
		,ip_jurname,ip_premium = ip_premium/(select count(*) from insturists where it_ipid = ip_id),
		ip_id,ip_comment,it_birthday,ip_jurfullname,
		ip_jurinn,ip_annuldate,it_name,it_fname
		from inspolicy 
		join insturists on it_ipid = ip_id
		where ip_id in (44991, 45037, 45117, 45118, 45119, 45120)
	) as f 
		
		ON d.IP_DLKey = f.IP_DLKey AND d.maxdate = f.ip_createdate
	
	
	
5 сен 12, 11:04    [13115942]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
iap
Member

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

для какой версии сервера надо?
5 сен 12, 11:47    [13116344]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с групировкой данных  [new]
thekip
Member

Откуда:
Сообщений: 17
2005 SP4

Запрос указанный выше - работает.
5 сен 12, 14:46    [13118054]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить