计算一个表中与另一表中的条件匹配的记录

Posted

技术标签:

【中文标题】计算一个表中与另一表中的条件匹配的记录【英文标题】:Counting records in one table that match condition in other table 【发布时间】:2019-06-27 15:05:00 【问题描述】:

我正在尝试从 table1 中获取与 table2 中的类别匹配的记录计数。

例如,表格可能如下所示:

ID     A          
1      value1   
2      value2
3      value3
4      value2

ID     A        Category
1      value1   Category1
2      value2   Category1
3      value3   Category2

现在假设我要统计 Table1 中属于 Category1 的记录

我想出的查询:

SELECT count(table1.A) as count, table2.Category from table1, table2 
WHERE table2.Category = 'Category1' AND table1.A = table2.A
GROUP BY table2.Category
ORDER BY count DESC

预期结果:

Category1  3

我得到的结果:

Category1  6

计数是 A 在 table1 中出现的次数乘以 A 在 table2 中出现的次数。 我也尝试了 LEFT JOIN,但这给了我相同的结果。

我怎样才能防止这种情况并只获得 table1 的计数?

【问题讨论】:

按类别分组并从列列表中删除AORDER BY 对于一条记录也没有意义。 谢谢。在我的代码中,我将两者分组并尝试删除 A。结果仍然相同。排序是为了最好地反映我的代码(处理数百万条记录;)) 我的意思是只按类别分组,而不是两者。 我试过了,结果还是一样 更新您的问题添加预期结果 【参考方案1】:

您可以使用 COUNT(DISTINCT) 来减少它的计数,只要您使用您知道在 table1 中唯一的列。

SELECT COUNT(DISTINCT table1.id) as count, table2.Category 
FROM table1 JOIN table2 ON table1.A = table2.A 
WHERE table2.Category = 'Category1'
GROUP BY table2.Category
ORDER BY count DESC

P.S.:请注意,我也将其更改为使用现代 JOIN 语法。这不是解决方案所必需的,但我们是时候停止使用 1989 逗号样式的连接语法了。

【讨论】:

以上是关于计算一个表中与另一表中的条件匹配的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个表中删除与另一表匹配的行?

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

将三行与另一表中的一行连接起来

从一个表中选择与客户关联的工单记录或另一表中的客户子项

Datatable C# - 如何根据 ID 从一个表中获取详细记录及其关联的另一表中的子记录

从一个表返回与另一表不匹配的单行