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

Откуда:
Сообщений: 32
Имеется следующая таблица:

POLICYPREMIUMSECTOR
100101
10051
100301
100102
100302
100303
100403
200101
200201
200302


Нужно для каждого POLICY в каждом последущем SECTOR найти все PREMIUM, которые существуют в предыдущих секторах,
но не существуют в каждом последующем, и добавить в отсутствующие строки.
Ожидается вот такой результат:

POLICYPREMIUMSECTOR
100101
10051
100301
10052
100102
100302
10053
100103
100303
100403
200101
200201
200102
200202
200302


Помогите решить эту задачу.
24 ноя 13, 17:07    [15181631]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
qwerty112
Guest
чёт проще не вижу...
declare @t table(POLICY int,PREMIUM int,SECTOR int)

insert into @t
select 100,10,1 union all
select 100,5,1 union all
select 100,30,1 union all
select 100,10,2 union all
select 100,30,2 union all
select 100,30,3 union all
select 100,40,3 union all
select 200,10,1 union all
select 200,20,1 union all
select 200,30,2

;with 
a as (select distinct POLICY from @t),
b as (select distinct PREMIUM from @t),
c as (select distinct SECTOR from @t)

select a.POLICY, b.PREMIUM, c.SECTOR
from a cross join b cross join c
where		exists(select 1 from @t t where a.POLICY=t.POLICY and b.PREMIUM=t.PREMIUM and c.SECTOR>t.SECTOR)
  and		exists(select 1 from @t t where a.POLICY=t.POLICY and c.SECTOR=t.SECTOR)
  and not	exists(select 1 from @t t where a.POLICY=t.POLICY and b.PREMIUM=t.PREMIUM and c.SECTOR=t.SECTOR)
order by 1,3

POLICY      PREMIUM     SECTOR
----------- ----------- -----------
100         5           2
100         5           3
100         10          3
200         10          2
200         20          2
24 ноя 13, 18:22    [15181800]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
sviha
Member

Откуда:
Сообщений: 32
Да, этот вариант, похоже, работает, но если в таблице будет намного больше строк,
то из-за cross join выборка будет очень долго бежать.
24 ноя 13, 18:59    [15181896]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
qwerty112
Guest
sviha
Да, этот вариант, похоже, работает, но если в таблице будет намного больше строк,
то из-за cross join выборка будет очень долго бежать.

нуу, не нравится cross join - нате cross apply )
select a.POLICY, b.PREMIUM, a.SECTOR 
from
	(select distinct POLICY, SECTOR from @t) a
cross apply
	(select distinct t.PREMIUM from @t t where t.POLICY=a.POLICY and t.SECTOR<=a.SECTOR) b 
where not exists (select 1 from @t t where t.POLICY=a.POLICY and t.PREMIUM=b.PREMIUM and t.SECTOR=a.SECTOR)
24 ноя 13, 20:22    [15182122]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
sdet
Member

Откуда:
Сообщений: 463
qwerty112
sviha
Да, этот вариант, похоже, работает, но если в таблице будет намного больше строк,
то из-за cross join выборка будет очень долго бежать.

нуу, не нравится cross join - нате cross apply )
select a.POLICY, b.PREMIUM, a.SECTOR 
from
	(select distinct POLICY, SECTOR from @t) a
cross apply
	(select distinct t.PREMIUM from @t t where t.POLICY=a.POLICY and t.SECTOR<=a.SECTOR) b 
where not exists (select 1 from @t t where t.POLICY=a.POLICY and t.PREMIUM=b.PREMIUM and t.SECTOR=a.SECTOR)

Не совсем понял. А без where не получится вот так?
select a.POLICY, b.PREMIUM, a.SECTOR 
from
	(select distinct POLICY, SECTOR from @t) a
cross apply
	(select distinct t.PREMIUM from @t t where t.POLICY=a.POLICY and t.SECTOR<=a.SECTOR) b 
24 ноя 13, 22:02    [15182395]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
qwerty112
Guest
sdet
Не совсем понял. А без where не получится вот так?
select a.POLICY, b.PREMIUM, a.SECTOR 
from
	(select distinct POLICY, SECTOR from @t) a
cross apply
	(select distinct t.PREMIUM from @t t where t.POLICY=a.POLICY and t.SECTOR<=a.SECTOR) b 

получится то, что в сабжевом посте под "Ожидается вот такой результат:",
но вам же нужно добавить не достающие строки, а не сразу получить такой ("Ожидается") результат
24 ноя 13, 22:06    [15182410]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
qwerty112
Guest
qwerty112
sdet
Не совсем понял. А без where не получится вот так?
select a.POLICY, b.PREMIUM, a.SECTOR 
from
	(select distinct POLICY, SECTOR from @t) a
cross apply
	(select distinct t.PREMIUM from @t t where t.POLICY=a.POLICY and t.SECTOR<=a.SECTOR) b 

получится то, что в сабжевом посте под "Ожидается вот такой результат:",
но вам же нужно добавить не достающие строки, а не сразу получить такой ("Ожидается") результат

т.е., я так понял, нужно было ещё это
insert into @t

select a.POLICY, b.PREMIUM, a.SECTOR  ....
24 ноя 13, 22:15    [15182440]     Ответить | Цитировать Сообщить модератору
 Re: Дополнить недостающие значения из предыдущий строк  [new]
sdet
Member

Откуда:
Сообщений: 463
qwerty112
qwerty112
пропущено...

получится то, что в сабжевом посте под "Ожидается вот такой результат:",
но вам же нужно добавить не достающие строки, а не сразу получить такой ("Ожидается") результат

т.е., я так понял, нужно было ещё это
insert into @t

select a.POLICY, b.PREMIUM, a.SECTOR  ....

Совершенно верно! Так было бы более понятнее.
24 ноя 13, 22:21    [15182453]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить