mysql - 将 INNER JOIN 查询与不同值的计数相结合

标签 mysql sql join count

我正在尝试链接两个具有相似列的表。我需要找出 table1.column1 和 table 2.column1 有多少值不同:

我当前的查询:

SELECT i10_descr.i10_code, gems_pcsi9.i10_code
FROM i10_descr INNER JOIN gems_pcsi9 ON i10_descr.i10_code = gems_pcsi9.i10_code
ORDER BY i10_descr.i10_code;

我知道这个查询显示了每个表的匹配代码:我不知道如何计算表中丢失/不同的代码。

此外,我还必须计算代码的比率。

非常感谢任何帮助、提示或指导。

谢谢

最佳答案

您可以使用反连接模式来获取一个表中存在的 i10_code 列表,但另一个表中不存在。例如:

SELECT i.i10_code
  FROM i10_descr i
  LEFT
  JOIN gems_pcsi9 g
    ON g.i10_code = i.i10_code
 WHERE g.i10_code IS NULL
 ORDER BY i.i10_code

如果您只想要计数,可以在 SELECT 列表中使用 COUNT(i.i10_code) 和/或 COUNT(DISINCT i.i10_code) 并删除ORDER BY 子句。

要获取 gems 表中不在 i10 表中的 i10_code,您需要执行相同的操作,但反转查询,以便 gems 成为“驱动”表。例如

SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
  FROM gems_pcsi9 g
  LEFT
  JOIN i10_descr i
    ON i.i10_code = g.i10_code
 WHERE i.i10_code IS NULL

如果您想合并差异数量,可以通过将两个查询设为内联 View 来合并这两个查询:

SELECT d.cnt_diff + e.cnt_diff AS total_diff 
  FROM (
         SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
           FROM gems_pcsi9 g
            LEFT
            JOIN i10_descr i
              ON i.i10_code = g.i10_code
           WHERE i.i10_code IS NULL
       ) d
 CROSS 
  JOIN ( 
         SELECT COUNT(DISTINCT i.i10_code) AS cnt_diff
           FROM i10_descr i
           LEFT
           JOIN gems_pcsi9 g
             ON g.i10_code = i.i10_code
          WHERE g.i10_code IS NULL
       ) e

注意:COUNT 聚合将省略 NULL 值。如果您还想“计算” i10_code 具有 NULL 值的行,则需要调整查询。如果您只需要多个不同的不同值,则可以使用 COUNT(DISTINCT )COUNT() 将给出行数。如果多行具有相同的 i10_code 值,这两个结果将会不同。

<小时/>

为了获得代码的“比率”,假设此时“差异”并不重要,您可以从每个表中获得代码的计数。可以使用内联 View 执行此操作的查询:

SELECT d.cnt / e.cnt AS ratio_cnt_g_over_cnt_i
     , d.cnt         AS cnt_g
     , e.cnt         AS cnt_i
  FROM (
         SELECT COUNT(DISTINCT g.i10_code) AS cnt
           FROM gems_pcsi9 g
       ) d
 CROSS 
  JOIN ( 
         SELECT COUNT(DISTINCT i.i10_code) AS cnt
           FROM i10_descr i
       ) e

关于mysql - 将 INNER JOIN 查询与不同值的计数相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483249/

相关文章:

mysql - 基本的全站搜索方法?

mysql - 选择字段中具有相同数据但大小写不同的行

java - 未收到来自服务器 : Java.net.SocketException 的响应:recvfrom 失败:ECONNRESET

mysql - 在mysql中显示函数定义

mysql - mysql 中的 max() 返回 9999 不超过那个?

mysql - 从 SELECT 查询中得到相反的结果

sql-server - 如何仅在明细表满足条件时获取主表的行?

mysql - "INNER JOIN"和 "LEFT JOIN"与 "GROUP BY"

python - 从 SQLAlchemy 中的另一列创建一列

mysql - 使用单个查询将 id 替换为名称