将INNER JOIN查询与不同值的Count组合在一起

时间:2014-05-05 22:53:09

标签: 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;

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

另外,我必须计算代码的比例。

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

由于

2 个答案:

答案 0 :(得分:1)

您可以使用反连接模式来获取一个表中存在的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子句。

要在i10表格中获取不在gems表格中的i10_code,你可以做同样的事情但是反转查询以便gems是"驾驶"表。 e.g。

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

如果要合并差异数量,可以将两个查询组合成内联视图:

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值的行,则这两个结果会有所不同。


获得"比率"代码,假设在这一点上,"差异"不重要,你从每张桌子上得到了一些代码。执行此操作的查询可以使用内联视图:

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

答案 1 :(得分:0)

另一种方法是使用union all聚合:

select in_i10descr, in_gems_pcsi9, count(*) as numcodes
from (select code, max(in_i10descr) as in_i10descr, max(in_gems_pcsi9) as in_gems_pcsi9
      from ((select i10_descr.i10_code as code, 1 as in_i10descr, 0 as in_gems_pcsi9
             from i10_descr
            ) union all
            (select gems_pcsi9.i10_code, 0, 1
             gems_pcsi9.i10_code
            )
           ) t
      group by code
     ) c
group by in_i10descr, in_gems_pcsi9;

这将分别在两个表中计算每个表中的事物计数。