【问题标题】:Search and match indexes in two different columns, return the sum of a third column - Postgresql在两个不同的列中搜索和匹配索引,返回第三列的总和 - Postgresql
【发布时间】:2020-04-02 20:36:48
【问题描述】:

我有一个名为“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位表示区内街区,如果公寓号码为00-0,后4位可以表示街区内的地段,或公寓, 或 store 等,如果公寓编号不是 00-0,在这种情况下,所有相同的公寓编号都指块内的同一地段。

我想要做的是传递“taxpayer_code”列表并获取地段的“lot_area”和“built_area”。问题是,如果这个人住在公寓里,她的公寓只是该地段总建筑面积的一小部分。所以,如果我搜索代码 0010030078%(-X 数字无关紧要),结果是: 地块面积 = 143 和建筑面积 = 130

但如果我搜索 0010030080%,我期望的结果是: 地块面积 = 283 和建筑面积 155

如果我搜索 0010030078%, 0010030079%,结果: 地块面积 = 426 和建筑面积 285

所以数据库应该获取纳税人代码,然后查看每个传递的代码的公寓号码是否不同于 00-0,如果是,它应该将共享相同公寓号码的所有其他纳税人代码添加到总和中同一区和街区。 (理想情况下,如果通过了属于不同地区或街区的税码,则应返回警告,并且如果将更多税码添加到总和中,则添加所有代码的列表会很好,但如果这太多了也没关系麻烦!)。

我是 SQL 新手,无法理解这一点,感谢您给我的每一个帮助,谢谢!

【问题讨论】:

  • "纳税人代码前 3 位是市区,后 3 位是市区内的街区" - 这是一个非常糟糕的设计。你不应该在一个原子值中存储多个不同的东西
  • 我同意这一点,但这就是城市的存储方式,或者至少是他们提供数据的方式,您认为最好创建一个新表来破坏不同列中的代码?

标签: sql postgresql postgresql-12


【解决方案1】:

嗯。 . .使用子查询和窗口函数来添加您想要的值:

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 . . . 

【讨论】:

  • @LaurenzAlbe 。 . .这与问题中显示的数据不一致。至于扫描整个表,OP 使用通配符来选择行。尽管它们可以针对问题中的特定模式进行优化,但这表明可能会同时选择多个纳税人。
  • 抱歉,我收到以下查询错误:错误:缺少表“ti”第 2 行的 FROM 子句条目:来自(选择 ti.*,
  • 另外,你认为创建两个不同的表会更好吗,一个带有预先制作的总和,一个代码如 00100300-0 和 00100302-7 等,第二个表生成一个这个新表与纳税人代码的关系通过了,那么查询只需要查找关系并返回结果吗?我可以用python创建这个预处理并将两个表加载到postgre,这会使性能更好吗?
  • @HelderCalil 。 . .正如 Laurence 所指出的,您的问题不是关于性能,而是关于功能。如果您想要关于所有纳税人的信息,此查询可能是您能做的最好的查询。但是,如果有一个小子集,请清楚您如何定义该子集并提出 问题。也就是说,将数据标准化以使公寓位于另一个表中似乎是一个不错的设计。
猜你喜欢
  • 2015-12-29
  • 2022-01-05
  • 2017-12-15
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多