Postgresql 一个表内的内部联接

Postgresql 一个表内的内部联接,postgresql,inner-join,postgis,self-join,Postgresql,Inner Join,Postgis,Self Join,我有一个问题,我一直试图解决,但我现在觉得卡住了,希望有人能帮助我 我有两张表:停车位列表停车位及其属性区域停车区 我希望我的结果也是这样: area_number total sum_hcp 1 20 2 2 45 5 3 30 5 我可以生成每个区域内总停车位的总和,例如: SELECT area.area_number, s

我有一个问题,我一直试图解决,但我现在觉得卡住了,希望有人能帮助我

我有两张表:停车位列表停车位及其属性区域停车区

我希望我的结果也是这样:

area_number     total     sum_hcp
1               20          2
2               45          5
3               30          5
我可以生成每个区域内总停车位的总和,例如:

SELECT area.area_number,
      sum(parking.parking_spaces) AS total_sum
FROM my_schema.parking_list parking,
     my_schema.area_zones area
WHERE st_intersects(area.geom, parking.geom)
GROUP BY area.area_number
以及每个区域内hcp停车的总和

SELECT area.area_number,
       sum(parking.parking_spaces) AS sum
FROM my_schema.parking_list parking,
     my_schema.area_zones area
WHERE st_intersects(area.geom, parking.geom) AND parking.hcp = 't' and parking.free = 't'
GROUP BY area.area_number as hcp_parking
但是我需要加入他们,这样我可以在一个视图中使用它。我尝试过几种不同的方法,但都没有运气

这里有一个例子

SELECT area.area_number,
       sum(parking.parking_spaces) total_sum
FROM (
   my_schema.parking_list AS parking, my_schema.area_zones AS area
   WHERE st_intersects(area.geom, parking.geom)
) AS total
LEFT JOIN
(
  SELECT sum(parking.parking_spaces) AS sum_hcp
  FROM my_schema.parking_list AS parking2, my_schema.area_zones AS area2
  WHERE st_intersects(area.geom, parking.geom) AND parking.hcp = 't' and parking.free = 't'
) AS sum_hcp ON total.area_number = sum_hcp.area_number
GROUP BY area.area_number

有人能告诉我我想做什么的正确方向吗?

通过使用条件表达式和聚合和函数,您应该能够在一个查询中获得这两个值:

SELECT 
  area.area_number,
  sum(parking.parking_spaces) AS total_sum
  sum(case when parking.hcp = 't' and parking.free = 't' 
           then parking.parking_spaces else 0 end
  ) as sum_hcp
FROM my_schema.parking_list parking,
     my_schema.area_zones area
WHERE st_intersects(area.geom, parking.geom) 
GROUP BY area.area_number;
如果要使用联接的派生表,请按以下方式执行,尽管前一个查询应该可以工作并执行得更好:

SELECT area.area_number,
      sum(parking.parking_spaces) AS total_sum
      sum(coalesce(hcp_parking.parking_spaces,0)) as sum_hcp
FROM my_schema.parking_list parking,
     my_schema.area_zones area
LEFT JOIN (
    SELECT area.area_number,
         parking.parking_spaces
    FROM my_schema.parking_list parking,
         my_schema.area_zones area
    WHERE st_intersects(area.geom, parking.geom) AND parking.hcp = 't' and parking.free = 't'
) hcp_parking ON area.area_number = hcp_parking.area_number
WHERE st_intersects(area.geom, parking.geom)
GROUP BY area.area_number;

谢谢你的反馈!我没有想到在函数中使用case。当我运行它时,它抱怨模式不存在。在FROM语句中,我写入了my.schema.parking\u列表、my\u schema.area\u区域。我觉得很奇怪,因为两个表都在from子句中。你知道为什么吗?@geogrow我不小心写了我的_schema _parking _列表,我想它应该是我的_schema.parking _列表,在你的评论中,你使用了my.schema.parking _列表,在my后面加了一个点,而不是一个u。仔细检查from条款。哦,是的,dot也在一个地方偷偷进入了我的评论。我知道它应该是我的_schema.parking _列表,这就是当查询抱怨模式不存在时我运行查询的方式。谢谢你抽出时间,thanks@geogrow您确定要在其中执行查询的数据库中确实存在该架构吗?