如何在单个SQL查询中获取单个和多个匹配项的计数

如何在单个SQL查询中获取单个和多个匹配项的计数,sql,postgresql,Sql,Postgresql,假设我有以下两个表 table1 ----------- col1 | col2 ----------- a1 b1 a2 b2 a3 b2 a4 b4 a1 b1 table2 ----------- col1 | col2 ----------- a1 b1 a2 b3 a2 b2 a4 b4 在上述示例中,表2中有一条记录(a1,b1)在表1中出现了不止一次(本例中为2),表2中有两条记录(a2,

假设我有以下两个表

table1
-----------
col1 | col2
-----------
a1      b1
a2      b2
a3      b2
a4      b4
a1      b1

table2
-----------
col1 | col2
-----------
a1      b1
a2      b3
a2      b2
a4      b4
在上述示例中,表2中有一条记录(a1,b1)在表1中出现了不止一次(本例中为2),表2中有两条记录(a2,b2)和(a4,b4))在表1中正好出现了一次。我希望表2中的记录数在表1中有一个匹配项,表2中的记录数在表1中有超过一个匹配项。如何在单个查询中获得此结果。如下所示:-

单个匹配计数|多重匹配计数
我可以用单独的查询来实现这一点,但我希望在单个查询中实现这一点

我认为从概念上讲,您想要的是
table2
中的一条记录与
table1
中的另一条记录匹配的次数。由于不需要报告匹配未发生的次数,我们可以从考虑两个表之间的
内部联接开始。然后,我们可以通过
col1
col2
进行聚合,并计算匹配数。最后,将其作为子查询传递,并计算每种类型的匹配发生的次数

SELECT
    SUM(CASE WHEN t.cnt = 1 THEN 1 ELSE 0 END) AS countOfSingleMatch,
    SUM(CASE WHEN t.cnt > 1 THEN 1 ELSE 0 END) AS countOfMultipleMatch
FROM
(
    SELECT t2.col1, t2.col2, COUNT(*) cnt
    FROM table2 t2
    INNER JOIN table1 t1
        ON t1.col1 = t2.col1 AND t1.col2 = t2.col2
    GROUP BY t2.col1, t2.col2
) t
输出:

此处演示:


我认为从概念上讲,您想要的是
表2中的一条记录与
表1中的另一条记录匹配的次数。由于不需要报告匹配未发生的次数,我们可以从考虑两个表之间的
内部联接开始。然后,我们可以通过
col1
col2
进行聚合,并计算匹配数。最后,将其作为子查询传递,并计算每种类型的匹配发生的次数

SELECT
    SUM(CASE WHEN t.cnt = 1 THEN 1 ELSE 0 END) AS countOfSingleMatch,
    SUM(CASE WHEN t.cnt > 1 THEN 1 ELSE 0 END) AS countOfMultipleMatch
FROM
(
    SELECT t2.col1, t2.col2, COUNT(*) cnt
    FROM table2 t2
    INNER JOIN table1 t1
        ON t1.col1 = t2.col1 AND t1.col2 = t2.col2
    GROUP BY t2.col1, t2.col2
) t
输出:

此处演示:


显示每个数字的单独查询。这个问题有点让人困惑。显示每个数字的单独查询。这个问题有点让人困惑。@Otshavadze我更喜欢使用
>1
,但是是的,我回答得太快了,我最初的回答有些粗糙。戈登醒着;你真的怪我吗?等等。。。戈登睡觉?@SqlZim LOL…他在哥伦比亚大学工作,我知道他在纽约时区大概应该醒着几小时…但是你永远也不知道…@TimBiegeleisen-LOL,不,在这种情况下有一些打字错误是可以接受的)太棒了@Tim Biegeleisen感谢您的快速回答,它对我很有用。@Otshavadze我更喜欢使用
>1
,但是是的,我回答得太快了,我最初的回答有些粗糙。戈登醒着;你真的怪我吗?等等。。。戈登睡觉?@SqlZim LOL…他在哥伦比亚大学工作,我知道他在纽约时区大概应该醒着几小时…但是你永远也不知道…@TimBiegeleisen-LOL,不,在这种情况下有一些打字错误是可以接受的)太棒了@Tim Biegeleisen谢谢你的快速回答,这对我很有用。