Вот версия «только для присоединения».Я бы сам предпочел версии CTE / оконных агрегатов:
declare @citycheap table(city varchar(100), Hotel varchar(100), prici money)
insert into @citycheap (city,Hotel,prici) values
('Poway', 'Ramada Inn', 100),
('Poway', 'Elks Oaks', 70),
('Poway', 'Days Inn', 85),
('Long Beach', 'Days Inn', 95),
('Long Beach', 'Motel 8', 65),
('Long Beach', 'Hampton Inn', 105),
('San Diego', 'Motel 6', 55),
('San Diego', 'Beach Inn', 115),
('San Diego', 'Days Inn', 85)
select
low.city,
low.Hotel,
low.prici,
100 * (high.prici - low.prici) / high.prici as PercentCheaper
from
@citycheap low
left join
@citycheap low_anti
on
low.city = low_anti.city and
low.prici > low_anti.prici
inner join
@citycheap high
left join
@citycheap high_anti
on
high.city = high_anti.city and
high.prici < high_anti.prici
on
high.city = low.city
where
high_anti.Hotel is null and
low_anti.Hotel is null
Можно надеяться увидеть симметрию в том, как я построил low
и high
.Сочетание left
объединения и предложения where
для гарантии того, что соединение не удалось, означает, что каждый из них имеет самую низкую или самую высокую цену в своих городах.
Затем мы присоединяемся к low
иhigh
вместе просто.Результат:
city Hotel prici PercentCheaper
------------- ----------- -------- ----------------
Poway Elks Oaks 70.00 30.00
Long Beach Motel 8 65.00 38.0952
San Diego Motel 6 55.00 52.1739
Обратите также внимание на то, как я использовал переменную таблицы для данных образца, а не вашу постоянную таблицу.Таким образом, я мог бы создать это в любой базе данных и не беспокоиться о том, чтобы оставить какие-либо остатки.