首页 > 解决方案 > 属于两个家族的名字的 SQL 数

问题描述

假设我有一个包含三列的表:第一列是 id,第二列包含名字,第三列包含姓氏。它们可以是具有相同名称但不同姓氏的行。但是,同一个名字不能在表中出现两次,同一个姓氏出现两次。

ID
0 约翰 史密斯
1 约翰 棕色的
2 约翰 琼斯
3 约翰 威廉姆斯
4 约翰 磨坊主
5 约翰 戴维斯
6 约翰 威尔逊
7 约翰 泰勒
8 约翰 白色的
9 约翰 克拉克
10 迈克尔 史密斯
11 迈克尔 棕色的
12 詹姆士 琼斯
13 詹姆士 威廉姆斯
14 罗伯特 磨坊主
15 罗伯特 戴维斯
16 罗伯特 威尔逊
17 罗伯特 棕色的
18 罗伯特 琼斯
19 罗伯特 威廉姆斯
20 珍妮弗 磨坊主
21 珍妮弗 戴维斯
22 珍妮弗 史密斯
23 珍妮弗 棕色的
24 珍妮弗 琼斯
25 珍妮弗 威廉姆斯
26 珍妮弗 威尔逊
27 珍妮弗 泰勒
28 珍妮弗 白色的

如何获得一个矩阵M,其行和列都是姓氏的所有可能值,M(f1,f2) 表示表中 f1 和 f2 出现的名字的数量?

即得到这个结果

在此处输入图像描述

谢谢您的帮助

标签: sqlgrouping

解决方案


作为纯 SQL 的结果获取(动态)矩阵是不可行的。您可以做的最好的事情是在 2 列中获取 2 个姓氏,如下所示:

SELECT
   t1.last_n name_a, t2.last_n name_b,
   count(case when t1.first_n = t2.first_n then 1 end) count_match   
FROM data_table t1,data_table t2
GROUP BY 1,2
ORDER BY 1,2

结果看起来像这样(这就像不在矩阵中的预期结果):

Results
    name_a  name_b      count_match
    BROWN   BROWN       4
    BROWN   CLARK       1
    BROWN   DAVIS       3
    BROWN   JONES       3
    BROWN   MILLER      3
    BROWN   SMITH       3
    BROWN   TAYLOR      2
    BROWN   WHITE       2
    BROWN   WILLIAMS    3
    BROWN   WILSON      3
    CLARK   BROWN       1
    CLARK   CLARK       1
    CLARK   DAVIS       1
    CLARK   JONES       1
    CLARK   MILLER      1
    CLARK   SMITH       1
    CLARK   TAYLOR      1
    CLARK   WHITE       1
    CLARK   WILLIAMS    1
    CLARK   WILSON      1
    DAVIS   BROWN       3
    DAVIS   CLARK       1
    DAVIS   DAVIS       3
    DAVIS   JONES       3
    DAVIS   MILLER      3
    DAVIS   SMITH       2
    DAVIS   TAYLOR      2
    DAVIS   WHITE       2
    DAVIS   WILLIAMS    3
    DAVIS   WILSON      3
    JONES   BROWN       3
    JONES   CLARK       1
    JONES   DAVIS       3
    ....

推荐阅读