如何从不同的表格中选择百分比和计数计算

时间:2019-06-03 17:26:03

标签: mysql

请我需要帮助来完成代码以执行以下操作:

  1. 计算基于批次的投票者的百分比。
  2. 按批次获取选民人数。

我的桌子:

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             |    
+-------------+----------------+----------------+----------------+

非常感谢您的支持,非常感谢。

1 个答案:

答案 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

请注意:

  1. COUNT(*)统计所有学生,甚至还包括那些尚未投票的学生(因为我们使用的是LEFT JOIN)。
  2. COUNT(vote.vote_id),即按联接的右侧侧的表的主键进行计数,仅计算已投票的学生。
  3. 我们必须将COUNT中的一个乘以1.0,以将结果强制为小数(否则,您将遇到整数除法)。

最后,您可能需要考虑将表名更改为一致:一个名称为voters(复数),另一个名称为vote(单数)。为了避免发动一场宗教战争,我不会告诉你要去哪一场。