0

我有两个表,每个表有一列,包含名称。名称可以有重复。每张桌子上都可以找到一个名字,也可以只在一张桌子上找到一个名字。我想做一个计算重复项的查询,对于每个表中的每个名称,列出这些值,如下所示:

| name | table1 | table2 |
| john | 12     | 23     |
| mark | 2      | 5      |
| mary |        | 10     |
| luke | 4      |        |

我尝试了不同的策略,UNION但没有运气。提前致谢!!!

4

4 回答 4

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
于 2012-07-28T10:18:57.377 回答
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

e

试试上面的方法:) 我为你做了一个小提琴来测试它: http ://sqlfiddle.com/#!3/796b2/3

它在每个表中有几个双名,并会告诉你哪些名字有双名,然后打印出来。不显示只出现一次的名称(通过 HAVING 子句实现)

于 2012-07-28T10:13:43.780 回答
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


SQLFiddle 演示

于 2012-07-28T10:29:32.307 回答
0

经过一番阅读,我认为这不是我想做的事情。这种情况可以通过 excel 或 libreoffice 中的数据透视表来解决。事实上,这是我使用的方法,结合一些 sql 语句来计算名称的出现并导出为 CSV。

UNION 绝对不行。一些机会是加入,但不是舒尔。

我找到了一篇与我讨论相同问题的帖子。

MySQL - 行到列

于 2012-07-28T16:48:31.527 回答