PostgreSQL在连接表后获取非重复值的计数

68bkxrlz  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(212)

我无法得到正确的计数。我有两张table:
Tbl1
| 身份证|名称|唿叫|
| --------------|--------------|--------------|
| 一百二十三|啊啊|十五岁|
| 一百三十二|bbbbb|0|
Tbl2
| 身份证|涉入|
| --------------|--------------|
| 一百二十三|0|
| 一百二十三|0|
| 一百二十三|1|
我想得到call = 15involvement = 0的id的计数。我的查询:

select t1.id,
       COUNT(CASE WHEN t1.call=15 THEN 1 END) as calls
from Tbl1 t1 
  left join Tbl2 t2 
    on t2.id = t1.id 
where t2.involvement = 0;

count的预期结果是1

mitkmikd

mitkmikd1#

1.你的代码缺少一个group by
1.添加了它之后,您就可以计算所有匹配的条目,而不是不同的条目。
1.聚合函数中的case语句正在模拟聚合筛选器。
1.如果用于join的列具有匹配的名称,则可以在join...using(...)中列出它们:
1.除非你用双引号括住你的对象名,否则它们会被折叠成小写,所以Tbl1Tbl2实际上是tbl1tbl2。一些ORM的,IDE的和客户端可以设置为自动报价。为了清楚起见,最好使用对象最终获得的实际名称。
Demo:

select count(distinct t2.id)     filter (where t1.call=15) as calls,
       array_agg(distinct t2.id) filter (where t1.call=15) as the_ids
from tbl1 t1 left join tbl2 t2 using(id)
where t2.involvement = 0;

如果您还想查看已计数的不同id的列表,可以使用上面显示的string_agg()array_agg()
查看Markdown帮助,以便将来格式化您的问题和答案。

py49o6xq

py49o6xq2#

我更喜欢基于exists的解决方案,原因有两个:

  • 左连接将t1.id s相乘,必须用distinct“修复”(除非idt1本身中不是唯一的-我假设它是一个键)
  • 意图是IMHO更清楚的读者-它说 * 任何 * 行与involvement = 0足以计数。(例如,如果必须将逻辑更改为 onlyinvolvement = 0,则条件将很容易更改为allnot exists运算符,但查询的核心将保持不变。
select count(t1.id)
from Tbl1 t1
where t1.call = 15
  and exists(select 1 from Tbl2 t2 where t2.id = t1.id and t2.involvemet = 0)

相关问题