请我需要帮助来完成代码以执行以下操作:
我的桌子:
voters table
+-------------+-------------+----------------+
| stud_id | name | batch |
+-------------+-------------+----------------+
| 1 | Peter | 2016 |
| 2 | John | 2017 |
| 3 | Wick | 2017 |
+-------------+-------------+----------------+
vote table
+-------------+----------------+
| vote_id | stud_id |
+-------------+----------------+
| 1 | 1 |
| 2 | 2 |
+-------------+----------------+
ive尝试了以下查询:
SELECT voters.batch,COUNT(*) AS voted_batch, 100.0 * COUNT(*) / (SELECT COUNT(*) FROM vote) AS percentage
FROM vote JOIN voters WHERE voters.stud_id=vote.stud_id
GROUP BY batch asc
该代码只能显示投票的百分比(而不是批次投票的百分比),并且只能进行总投票,我很困惑只能显示总投票者
我期望的表选择是:
+-------------+----------------+----------------+----------------+
| batch |total_batch | voted_batch | percentage |
+-------------+----------------+----------------+----------------+
|2016 | 1 | 1 | 100 |
|2017 | 2 | 1 | 50 |
+-------------+----------------+----------------+----------------+
非常感谢您的支持,非常感谢。
答案 0 :(得分:0)
要区分批次中的学生总数和给定批次中的投票学生数量,您需要在COUNT
表达式中使用不同的字段:< / p>
SELECT voters.batch, COUNT(*) AS total_batch, COUNT(vote.vote_id) AS voted_batch, (COUNT(vote.vote_id) * 1.0) / (COUNT(*)) AS percentage FROM voters LEFT JOIN vote ON vote.stud_id = voters.stud_id GROUP BY voters.batch
请注意:
COUNT(*)
统计所有学生,甚至还包括那些尚未投票的学生(因为我们使用的是LEFT JOIN
)。COUNT(vote.vote_id)
,即按联接的右侧侧的表的主键进行计数,仅计算已投票的学生。COUNT
中的一个乘以1.0,以将结果强制为小数(否则,您将遇到整数除法)。最后,您可能需要考虑将表名更改为一致:一个名称为voters
(复数),另一个名称为vote
(单数)。为了避免发动一场宗教战争,我不会告诉你要去哪一场。