2016-12-17 2 views
0

Я пытаюсь получить строку 11 (которая может иметь несколько результатов квадратных номеров в разных областях дома, таких как веранды, гаражи и включает в себя жилую площадь) и вычесть линию 10, если возможно, получить общую площадь площадей в дом, отличный от жилой площади.Должен ли я использовать подзапрос или сумму в этой ситуации?

as a-- sum(id1.[calc_area] - pp.living_area) as [other_ area], 

моя проблема два числа из разных таблиц, а select оператор использует другую from таблицу pv. Что было бы самым простым способом добиться этого?

select distinct pv.prop_id, 
pv.hood_cd as neighborhood, 
pv.abs_subdv_cd as subdivision, 
cast (pv.[legal_desc] as char(16)) as legal, 
[deed_date], 
[consideration], 
pv.prop_val_yr as year, 
sts1.[situs_num] as address, 
cast(sts1.[situs_street] as char(11)) as street, 
pp.living_area, 
id1.[calc_area] as [total_area], 
cast (pp.[land_total_acres]as decimal (6,2))as acres, 
[sale_type], 
case when [sale_date] >='01/01/2014'then convert(varchar(18), [sale_date], 101)else''end as'sale date', 
pp.ls_table, 
(pv.land_hstd_val + pv.land_non_hstd_val + pv.ag_market + pv.timber_market)as land_val, 
cast(pp.[main_land_total_adj]as decimal (5,2)) as land_adj_total, 
(pv.imprv_hstd_val + pv.imprv_non_hstd_val)as imprv_val, 
case when [sale_date] >='01/01/2014'then [sale_price] else 0 end as'sale price', 
pv.market 
from property_val pv with (nolock)   
inner join prop_supp_assoc psa with (nolock) on 
     pv.prop_id = psa.prop_id 
     and pv.prop_val_yr = psa.owner_tax_yr 
     and pv.sup_num = psa.sup_num 
inner join property p with (nolock)on 
     pv.prop_id = p.prop_id 
inner join owner o with (nolock) on 
     pv.prop_id = o.prop_id 
     and pv.prop_val_yr = o.owner_tax_yr 
     and pv.sup_num = o.sup_num 
inner join account ac with (nolock) on 
     o.owner_id = ac.acct_id 
inner join property_profile pp with (nolock) on 
     pv.prop_id = pp.prop_id 
     and pv.prop_val_yr = pp.prop_val_yr 
left outer join imprv_detail as id1 with (nolock) on 
     pv.prop_id = id1.prop_id 
     and pv.prop_val_yr = id1.prop_val_yr 
     and pv.sup_num = id1.sup_num 
left outer join 
     (select cop.prop_id, 
     convert(varchar(20), co.deed_dt, 101) as deed_date, 
     co.consideration as consideration, s.sl_dt as sale_date, 
     s.sl_price as sale_price, s.sl_type_cd as sale_type 
       from chg_of_owner_prop_assoc cop with (nolock) 
       inner join chg_of_owner co with (nolock) on 
        co.chg_of_owner_id = cop.chg_of_owner_id 
       inner join sale s with (nolock) on 
        co.chg_of_owner_id = s.chg_of_owner_id 
       where cop.seq_num = 0 
      )as c 
       on c.prop_id = pv.prop_id 

основных результаты с некоторыми столбцами скрытых -----

prop_id address street  living_area total_area acres 
x  322  SURBER ST 939    48   0 
x  322  SURBER ST 939   288   0 
x  322  SURBER ST 939   939   0 
xy  318  SURBER STRE 1202    0   0 
xy  318  SURBER STRE 1202   120   0 
xy  318  SURBER STRE 1202   340   0 
xy  318  SURBER STRE 1202   1052   0 
+0

СУММА будет более производительной на больших столах, однако, я не хотел бы, чтобы написать эту группу, со всеми своими полями. Если таблицы относительно малы, то используйте свое лучшее суждение. Возможно, вы захотите рассмотреть подзапрос внутри вашего основного. –

+0

Yep ... «group by» будет похож на книгу. Я надеялся, что короткий подзапрос будет умнее ... но, честно говоря, я не уверен, как заставить его работать. – Russ

+0

Каждая таблица имеет около 40 000 строк. – Russ

ответ

0

, если вам нужна только дополнительная сумма и всю возвращенные в настоящее время строки используйте SUM OVER функцию:

sum(id1.[calc_area] - pp.living_area) over (PARTITION BY pv.prop_id, pv.prop_val_yr) as [other_ area] 

вы можете изменить разбиение, например:

sum(id1.[calc_area] - pp.living_area) over (PARTITION BY pv.prop_id, pv.prop_val_yr, pp.ls_table) as [other_ area] 

, но если у вас есть ненужные строки умножения, когда вы присоединитесь таблицы и вам необходимо агрегированные значения из этой таблицы, а затем использовать подзапрос в OUTER APPLY пункте (а не присоединиться к этой таблице в другой форме), например:

SELECT ... 
, id1.total_area 
... 
OUTER APPLY (
    SELECT Sum(calc_area) as total_area 
    FROM imprv_detail 
    WHERE prop_id = pv.prop_id = id1. 
    and prop_val_yr = pv.prop_val_yr 
    and sup_num = pv.sup_num 
) AS id1 

затем рассчитать other_area использования total_area - total_living_area

+0

Ls_table - это график, на котором основана стоимость земельного участка. Все остальные имеют уникальные значения для идентификатора свойства. За исключением calc_area. Он будет иметь ценность для каждой области собственности, такой как крыльцо, гараж .... и т. Д. чтобы сделать его уникальным, мне нужно его суммировать. Сравнивая информацию о том, сколько жилой площади и сколько «других» кв. Футов важно. Так что это единственная, мне нужна сумма для – Russ

+0

Спасибо! Я ценю помощь. – Russ