Предпочитают писать более простой SQL, который отражает требования. Если вы хотите сделать это с помощью объединений, это может быстро выйти из-под контроля, поскольку объединения будут пересекаться друг с другом и увеличивать количество строк. Кроме того, два пронумерованных предложения требуют различных условий для выражения, а второе выполнимо только с LEFT JOIN
, который, как вы надеетесь, потерпит неудачу.
Я бы предпочел использовать два EXISTS
чека:
declare @t table (PID int, TIV_2011 int, TIV_2012 int, Lat decimal(8,6),Lon decimal(9,6))
insert into @t(PID,TIV_2011,TIV_2012,LAT,LON) values
(123,1000,1200,20.123489,80.341245),
(456,1500,3000,21.341287,80.341245),
(789,2000,1500,21.341287,80.341245),
(321,1000, 750,21.123641,80.238716),
(567,1500,2300,22.123641,80.238716)
select
CONVERT(decimal(12,2),SUM(TIV_2012))
from
@t t_keep
where
exists (select * from @t t_other2011
where t_keep.PID != t_other2011.PID
and t_keep.TIV_2011 = t_other2011.TIV_2011
) and
not exists (select * from @t t_city
where t_keep.PID != t_city.PID and
t_keep.Lat = t_city.Lat and
t_keep.Lon = t_city.Lon)
Выберите строки из @t
(t_keep
), где (сначала EXISTS
) есть еще одна строка в таблице для другого держателя страхового полиса, где мы разделяем то же значение TIV_2011
. Но также (and
) где (секунда EXISTS
) там не является строкой в таблице для другого держателя полиса, где у нас одни и те же значения Lat
и Lon
.
Это дает значение 4250.