Поиск и сопоставление индексов в двух разных столбцах, возврат суммы третьего столбца - Postgresql - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица с названием "tax_info", в этой таблице хранится информация о земельном налоге моего города, она выглядит следующим образом:

taxpayer_code  |  condominium_num  |  lot_area  |  built_area
-------------------------------------------------------------
0010030078-2   |     00-0          |   143      |    130
0010030079-1   |     02-7          |   283      |    57
0010030080-1   |     02-7          |   283      |    48
0010030081-1   |     02-7          |   283      |    50

первые 3 цифры кода налогоплательщика относятся к району города следующие 3 к блоку в пределах района и следующие 4 могут относиться к лоту в блоке, если номер квартиры 00-0, или к квартире, или магазину и т. д. c, если номер квартиры другой чем 00-0, и в этом случае все равные номера кондо ссылаются на один и тот же лот внутри блока.

я хочу передать список "taxpayer_code" и получить "lot_area" и "built_area" для лотов. проблема в том, что, если человек живет в квартире, ее квартира составляет часть общей застроенной площади для участка. Итак, если я ищу код 0010030078% (число -X не имеет значения), результат будет следующим: Площадь лота = 143 и Зона застройки = 130

Но если я ищу 0010030080%, результат, который я ожидаю Это: Площадь лота = 283 и Зона застройки 155

И если я ищу 0010030078%, 0010030079%, результат: Площадь лота = 426 и Зона застройки 285

Таким образом, база данных должна получить коды налогоплательщиков, а затем посмотрите, отличается ли номер кондоминиума от 00-0 для каждого переданного кода; если да, то он должен добавить к сумме все другие коды налогоплательщиков, которые используют один и тот же номер кондо в том же районе и блоке. (в идеале, если налоговые коды, принадлежащие разным районам или блокам пройдены, должно быть возвращено предупреждение, и если к сумме добавлено больше налоговых кодов, было бы неплохо перечислить все добавленные коды, но это нормально, если это слишком много хлопот!).

Я новичок в SQL и не могу обдумать это, я ценю любую помощь, которую вы можете мне дать, спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

Хммм. , , используйте подзапрос и оконные функции, чтобы сложить нужные значения:

select ti.*
from (select ti.*,
             (case when condominium_num <> '00-0'
                   then sum(built_area) over (partition by condominium_num)
                   else built_area
              end) as real_built_area
      from tax_info ti
     ) ti
where . . . 
...