sql - 属于两个家族的名字的 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 出现的名字的数量?
即得到这个结果
谢谢您的帮助
解决方案
作为纯 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
....
推荐阅读
- python - 当传递一个包含嵌入空格的字符串的元组时,为什么easygui会插入大括号?
- algorithm - 递归函数的空间复杂度分析
- google-apps-script - iterate through selected cells in Google Sheets
- android - 我没有从谷歌获得任何适合安卓应用的用户数据
- core-plot - CorePlot:将 Y 轴更改为从 3 开始,而不是 0
- javascript - momentjs format returning date a day off?
- django - django count data from model and show it on template
- swift - 如果索引超出范围 SwiftyJSON 和 AlamoFire,则继续下一个结果
- reactjs - 在 React 组件中使用 ImmutableJS
- java - java.lang.NoSuchMethodError:Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzUU()Z;