我有两个表,每个表包含一个列,包含名称。 名称可以有重复项。每个表上都可以找到一个名称,也可以只在一个表中找到。 我想创建一个计算重复项的查询,为每个表中的每个名称列出这些值,如下所示:
| name | table1 | table2 |
| john | 12 | 23 |
| mark | 2 | 5 |
| mary | | 10 |
| luke | 4 | |
我使用UNION
尝试了不同的策略,但没有运气。
在此先感谢!!!
答案 0 :(得分:1)
SELECT DISTINCT t1.name, t1.cnt1, t2.cnt2
FROM
(SELECT name,count(name) as cnt1 FROM table1 GROUP BY name) t1
LEFT JOIN
(SELECT name,count(name) as cnt2 FROM table2 GROUP BY name) t2
ON t1.name = t2.name
UNION
SELECT DISTINCT t2.name, t1.cnt1, t2.cnt2
FROM
(SELECT name,count(name) as cnt1 FROM table1 GROUP BY name) t1
RIGHT JOIN
(SELECT name,count(name) as cnt2 FROM table2 GROUP BY name) t2
ON t1.name = t2.name
答案 1 :(得分:0)
SELECT SUM(res.cn), name
FROM
(
SELECT name, count(name) as cn from table1 GROUP BY name HAVING count(name) > 1
UNION ALL
SELECT name, count(name) as cn from table2 GROUP BY name HAVING count(name)>1
) as res
GROUP BY nam
ë
试试上面的内容:)我为你做了一个小提琴来测试它: http://sqlfiddle.com/#!3/796b2/3
每个表格中都有一些双重名称,会显示哪些名称有双打,然后打印出来。仅显示一次的名称未显示(通过HAVING子句实现)
答案 2 :(得分:0)
这是一个更简单的解决方案:
您可以UNION
将两个表中的名称放在一起,手动将其原始表格与tbl
列区分开来。
然后,它只是一个简单的GROUP BY
,使用区分列进行条件聚合:
SELECT a.name,
NULLIF(COUNT(CASE a.tbl WHEN 1 THEN 1 END), 0) AS table1,
NULLIF(COUNT(CASE a.tbl WHEN 2 THEN 1 END), 0) AS table2
FROM
(
SELECT name, 1 AS tbl FROM table1 UNION ALL
SELECT name, 2 FROM table2
) a
GROUP BY a.name
根据您所需的结果集,如果结果为NULL
,我们会0
计算值。
答案 3 :(得分:0)
经过一番阅读后,我不认为这是我想要做的事情。这种情况可以通过excel或libreoffice中的数据透视表来解决。 事实上,这是我使用的方法,结合一些sql stataments来计算名称的出现并导出为CSV。
UNION无法正常工作。有一些机会是加入,但不是舒尔。
我发现了一篇与我讨论相同问题的帖子。