使用 SQL 显示来自四个表的数据
Display Data from Four Tables with SQL
四个Table
我有四个表,即 Candidates
、Parties
、Multiplier
和 Votes
。
Table 带有示例的布局
表格布局如下:
- 候选人
例如
+--------------+----------+----------------+--------+
| Candidate_ID | Surname | Name | Gender |
+--------------+----------+----------------+--------+
| 1 | BAREND | INNOCK CHARLIE | MALE |
| 2 | DU PREEZ | DONAVAN GARY | MALE |
| 3 | BERTELS | MEGAN MARIÉ | FEMALE |
| 4 | HOPLEY | CAITLIN TAYLOR | FEMALE |
+--------------+----------+----------------+--------+
- 派对
例如
+----------+------------+-------+-------+
| Party_ID | Party_Type | Grade | Class |
+----------+------------+-------+-------+
| H1 | Head | | |
| T1 | TEACHER | | |
| 8N | LEARNER | 8 | N |
| 9N | LEARNER | 9 | N |
| 10N | LEARNER | 10 | N |
| 11N | LEARNER | 11 | N |
+----------+------------+-------+-------+
注意:N 介于 A 和 J 之间,例如8A, 8B, 8C … 8J.
- 乘数
例如
+------------+------------+
| Party_Type | Multiplier |
+------------+------------+
| HEAD | 3 |
| TEACHER | 2 |
| LEARNER | 1 |
+------------+------------+
- 票数:A类是对管理委员会职位的投票,B类是对副手的投票,C类是对主席的投票,例如头女孩或男孩。
例如
+--------------+----------+--------+--------+--------+
| Candidate_ID | Party_ID | ClassA | ClassB | ClassC |
+--------------+----------+--------+--------+--------+
| 1 | H1 | 2 | 2 | 1 |
| 4 | 8C | 23 | 5 | 2 |
| 2 | H1 | 3 | 2 | 2 |
| 3 | 9D | 30 | 16 | 10 |
| 1 | T1 | 15 | 7 | 5 |
| 3 | T1 | 17 | 10 | 9 |
| 4 | T1 | 4 | 2 | 1 |
| 2 | 10E | 24 | 10 | 4 |
+--------------+----------+--------+--------+--------+
基本上,我正在尝试编写一个 SQL 语句来计算每个候选人的所有选票,然后根据选票从多到少对记录进行排序,如下所示:
+----+----------+----------------+--------+--------+--------+
| ID | Surname | Names | ClassA | ClassB | ClassC |
+----+----------+----------------+--------+--------+--------+
| 3 | BERTELS | MEGAN MARIÉ | 96 | 36 | 28 |
| 4 | HOPLEY | CAITLIN TAYLOR | 64 | 19 | 8 |
| 1 | BAREND | INNOCK CHARLIE | 36 | 20 | 13 |
| 2 | DU PREEZ | DONAVAN GARY | 33 | 16 | 10 |
+----+----------+----------------+--------+--------+--------+
我的努力
到目前为止,我只能在不使用乘数的情况下统计所有选票:
SELECT C.Candidate_ID, C.Surname, C.Name, Sum(V.ClassA) AS ClassA, Sum(V.ClassB) AS ClassB, Sum(V.ClassC) AS ClassC
FROM Candidates C INNER JOIN Votes V ON C.Candidate_ID = V.Candidate_ID
GROUP BY C.Candidate_ID, C.Surname, C.Name;
我的问题
所以我相信我的问题很清楚:我需要根据选票来自的政党类型分别应用乘数。
我认为应该这样做:
SELECT
C.Candidate_ID,
C.Surname,
C.Name,
SUM(V.ClassA * M.Multiplier) AS ClassA,
SUM(V.ClassB * M.Multiplier) AS ClassB,
SUM(V.ClassC * M.Multiplier) AS ClassC
FROM
( ( Candidates C
INNER JOIN Votes V ON C.Candidate_ID = V.Candidate_ID )
INNER JOIN Parties P ON V.Party_ID = P.Party_ID )
INNER JOIN Multiplier M ON P.Party_Type = M.Party_Type
GROUP BY
C.Candidate_ID,
C.Surname,
C.Name;
四个Table
我有四个表,即 Candidates
、Parties
、Multiplier
和 Votes
。
Table 带有示例的布局
表格布局如下:
- 候选人
例如
+--------------+----------+----------------+--------+
| Candidate_ID | Surname | Name | Gender |
+--------------+----------+----------------+--------+
| 1 | BAREND | INNOCK CHARLIE | MALE |
| 2 | DU PREEZ | DONAVAN GARY | MALE |
| 3 | BERTELS | MEGAN MARIÉ | FEMALE |
| 4 | HOPLEY | CAITLIN TAYLOR | FEMALE |
+--------------+----------+----------------+--------+
- 派对
例如
+----------+------------+-------+-------+
| Party_ID | Party_Type | Grade | Class |
+----------+------------+-------+-------+
| H1 | Head | | |
| T1 | TEACHER | | |
| 8N | LEARNER | 8 | N |
| 9N | LEARNER | 9 | N |
| 10N | LEARNER | 10 | N |
| 11N | LEARNER | 11 | N |
+----------+------------+-------+-------+
注意:N 介于 A 和 J 之间,例如8A, 8B, 8C … 8J.
- 乘数
例如
+------------+------------+
| Party_Type | Multiplier |
+------------+------------+
| HEAD | 3 |
| TEACHER | 2 |
| LEARNER | 1 |
+------------+------------+
- 票数:A类是对管理委员会职位的投票,B类是对副手的投票,C类是对主席的投票,例如头女孩或男孩。
例如
+--------------+----------+--------+--------+--------+
| Candidate_ID | Party_ID | ClassA | ClassB | ClassC |
+--------------+----------+--------+--------+--------+
| 1 | H1 | 2 | 2 | 1 |
| 4 | 8C | 23 | 5 | 2 |
| 2 | H1 | 3 | 2 | 2 |
| 3 | 9D | 30 | 16 | 10 |
| 1 | T1 | 15 | 7 | 5 |
| 3 | T1 | 17 | 10 | 9 |
| 4 | T1 | 4 | 2 | 1 |
| 2 | 10E | 24 | 10 | 4 |
+--------------+----------+--------+--------+--------+
基本上,我正在尝试编写一个 SQL 语句来计算每个候选人的所有选票,然后根据选票从多到少对记录进行排序,如下所示:
+----+----------+----------------+--------+--------+--------+
| ID | Surname | Names | ClassA | ClassB | ClassC |
+----+----------+----------------+--------+--------+--------+
| 3 | BERTELS | MEGAN MARIÉ | 96 | 36 | 28 |
| 4 | HOPLEY | CAITLIN TAYLOR | 64 | 19 | 8 |
| 1 | BAREND | INNOCK CHARLIE | 36 | 20 | 13 |
| 2 | DU PREEZ | DONAVAN GARY | 33 | 16 | 10 |
+----+----------+----------------+--------+--------+--------+
我的努力
到目前为止,我只能在不使用乘数的情况下统计所有选票:
SELECT C.Candidate_ID, C.Surname, C.Name, Sum(V.ClassA) AS ClassA, Sum(V.ClassB) AS ClassB, Sum(V.ClassC) AS ClassC
FROM Candidates C INNER JOIN Votes V ON C.Candidate_ID = V.Candidate_ID
GROUP BY C.Candidate_ID, C.Surname, C.Name;
我的问题
所以我相信我的问题很清楚:我需要根据选票来自的政党类型分别应用乘数。
我认为应该这样做:
SELECT
C.Candidate_ID,
C.Surname,
C.Name,
SUM(V.ClassA * M.Multiplier) AS ClassA,
SUM(V.ClassB * M.Multiplier) AS ClassB,
SUM(V.ClassC * M.Multiplier) AS ClassC
FROM
( ( Candidates C
INNER JOIN Votes V ON C.Candidate_ID = V.Candidate_ID )
INNER JOIN Parties P ON V.Party_ID = P.Party_ID )
INNER JOIN Multiplier M ON P.Party_Type = M.Party_Type
GROUP BY
C.Candidate_ID,
C.Surname,
C.Name;