我无法得到正确的计数。我有两张table:Tbl1
| 身份证|名称|唿叫|
| --------------|--------------|--------------|
| 一百二十三|啊啊|十五岁|
| 一百三十二|bbbbb|0|Tbl2
| 身份证|涉入|
| --------------|--------------|
| 一百二十三|0|
| 一百二十三|0|
| 一百二十三|1|
我想得到call = 15
和involvement = 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
。
2条答案
按热度按时间mitkmikd1#
1.你的代码缺少一个
group by
。1.添加了它之后,您就可以计算所有匹配的条目,而不是不同的条目。
1.聚合函数中的
case
语句正在模拟聚合筛选器。1.如果用于
join
的列具有匹配的名称,则可以在join...using(...)
中列出它们:1.除非你用双引号括住你的对象名,否则它们会被折叠成小写,所以
Tbl1
和Tbl2
实际上是tbl1
和tbl2
。一些ORM的,IDE的和客户端可以设置为自动报价。为了清楚起见,最好使用对象最终获得的实际名称。Demo:
如果您还想查看已计数的不同
id
的列表,可以使用上面显示的string_agg()
或array_agg()
。查看Markdown帮助,以便将来格式化您的问题和答案。
py49o6xq2#
我更喜欢基于
exists
的解决方案,原因有两个:t1.id
s相乘,必须用distinct
“修复”(除非id
在t1
本身中不是唯一的-我假设它是一个键)involvement = 0
足以计数。(例如,如果必须将逻辑更改为 onlyinvolvement = 0
,则条件将很容易更改为all
或not exists
运算符,但查询的核心将保持不变。