【问题标题】:How to get count of single and multiple matches in a single SQL query如何在单个 SQL 查询中获取单个和多个匹配项的计数
【发布时间】:2017-07-30 13:30:25
【问题描述】:

假设我有以下 2 个表格,

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

table2
-----------
col1 | col2
-----------
a1      b1
a2      b3
a2      b2
a4      b4

在上面的例子中,table2中有一条记录(a1,b1)在table1(本例中为2)中出现了不止一次,table2中有两条记录((a2,b2)和(a4,b4))在表 1 中只出现一次。我想要在表 1 中有精确匹配的 table2 中的记录数和在 table1 中有超过 1 个匹配的 table2 中的记录数。如何在单个查询中获得此结果。如下所示:-

countOfSingleMatch | countOfMultipleMatch

    2                    1

我可以通过单独的查询来做到这一点,但我想在单个查询中实现这一点。

【问题讨论】:

  • 显示每个数字的单独查询。这个问题有点混乱。

标签: sql postgresql


【解决方案1】:

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

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

输出:

演示在这里:

Rextester

【讨论】:

  • @OtoShavadze 我更喜欢使用> 1,但是是的,我回答得太快了,我最初的答案有些粗糙。戈登醒了;你真的在这里责怪我吗?
  • 等等...戈登睡了吗?
  • @SqlZim LOL...他在哥伦比亚工作,我大致知道他在纽约时区应该几点醒...但话说回来,你永远不知道...
  • @TimBiegeleisen - 大声笑,不,在这种情况下可以接受一些拼写错误))
  • 太棒了。 @Tim Biegeleisen 感谢您的快速回答,它对我有用。
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2018-09-06
相关资源
最近更新 更多