我正在尝试链接两个具有相似列的表。我需要找出有多少个值与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;
我知道这个查询显示了每个表的匹配代码:我无法弄清楚如何计算表中丢失/不同的代码。
另外,我必须计算代码的比例。
非常感谢任何帮助,提示或指示。
由于
答案 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;
这将分别在两个表中计算每个表中的事物计数。