我有两张桌子:

表A

CrimeType CrimeSubType Neighborhood Year
1 1 Jeff Park 2024
2 2 Cong Park 2023
2 2 Cong Park 2024
2 2 Jeff Park 2024
3 1 Jeff Park 2024
3 2 Jeff Park 2023
3 1 Jeff Park 2023

然后我有了第二个表,它将犯罪类型定义为人类可读的类别

表B

CrimeType CrimeSubType Category
1 1 VIOLENT CRIME
1 2 VIOLENT CRIME
2 1 VIOLENT CRIME
2 2 PROPERTY CRIME
3 1 PROPERTY CRIME
3 2 DRUG CRIME

我希望我的postgres的输出(如果可能)显示如下结果(假设年份为2024年)

Neighborhood Category Counts
Jeff Park VIOLENT CRIME 0
Cong Park VIOLENT CRIME 1
Jeff Park PROPERTY CRIME 3
Cong Park PROPERTY CRIME 2
Jeff Park DRUG CRIME 1
Cong Park DRUG CRIME 0

我能够让它看起来像上面使用类似以下的东西:

SELECT
  Neighborhood,
  Category,
  COUNT(Neighborhood)
from A
INNER JOIN B
   ON (b.CrimeType = 
a.crimeType
  AND B.CrimeSubType = b.CrimeSubType
  AND a.year = 2024
GROUP BY
  Neighborhood,
  Category

我查找了一些答案,它说要将内部联接更改为左联接或右联接.(我相信在我的情况下,这将是一个正确的加入?)然而,我觉得我的情况太复杂了,我错过了一些东西.

SELECT
  Neighborhood,
  Category,
  COUNT(Neighborhood)
from A
LEFT JOIN B
   ON (b.CrimeType = a.crimeType
  AND B.CrimeSubType = b.CrimeSubType
  AND a.year = 2024
GROUP BY
  Neighborhood,
  Category

仍然不起作用,它将显示一些空值,但不是我想要的方式,我遗漏了什么?

推荐答案

理所当然,应该有真正的表格,包含所有类别和邻居.如果没有,我们可以使用子查询来查找它们,然后像您已经做的那样,离开连接:

SELECT n.Neighborhood, c.Category, COUNT(b.CrimeType) AS Counts
FROM (SELECT DISTINCT Neighborhood FROM A) n
CROSS JOIN (SELECT DISTINCT Category FROM B) c
LEFT JOIN A a
    ON a.Neighborhood = n.Neighborhood AND
       a.year = 2024
LEFT JOIN B b
    ON B b.Category = c.Category AND
         b.CrimeType = a.CrimeType AND
         b.CrimeSubType = b.CrimeSubType
GROUP BY
    n.Neighborhood,
    c.Category
ORDER BY
    n.Neighborhood,
    c.Category;

Sql相关问答推荐

SUM(条件)在Oracle?

SQL(PostgreSQL)从条件创建点表

查找表中特定值的上次更新日期

从列中提取子字符串的ORDER BY CASE语句

查询页面推荐

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

每小时 Select 1行

我如何才能在付款人单列中拉出只有9个付款人单的人?

获取分布在同一行的列中的出现次数

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

用替代方案替换 SQL Cursor 以提高性能

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

递归 CTE 附加为行

Postgres存在限制问题「小值」

BigQuery Pivot 遗漏行

Set vs let vs 在snowflake中声明变量

SQL Select 最大并获取列名

如何对 SQL 表中的连续时间戳进行分组?

将单行中的多个行值转换为列

SQL中所有先前日期的累计总和