与mysql中的百分比相同的列值输出

与mysql中的百分比相同的列值输出,mysql,sql,aggregation,Mysql,Sql,Aggregation,样本表: 此表中有5个员工1条目。1表示出席,2表示缺席,3表示迟到。我想要以下输出 样本输出: 这里有一个非常简单的方法: select employee_id, avg( present_id = 1 ) as present_ratio, avg( present_id = 2 ) as absent_ratio, avg( present_id = 3 ) as late_ratio from t group by employee_id;

样本表:

此表中有5个员工1条目。1表示出席,2表示缺席,3表示迟到。我想要以下输出

样本输出:
这里有一个非常简单的方法:

select employee_id,
       avg( present_id = 1 ) as present_ratio,
       avg( present_id = 2 ) as absent_ratio,
       avg( present_id = 3 ) as late_ratio
from t
group by employee_id;
这将生成一个介于0和1之间的数字。如果你真的想要一个百分比,你可以乘以100;我发现这个比率更容易理解

这使用了一个MySQL扩展,其中布尔表达式的结果在数字上下文中被视为一个数字,0表示false,1表示true。更详细的方法使用ANSI标准功能:

avg(case when present_id = 1 then 1.0 else 0 end) as present_ratio

这里有一个非常简单的方法:

select employee_id,
       avg( present_id = 1 ) as present_ratio,
       avg( present_id = 2 ) as absent_ratio,
       avg( present_id = 3 ) as late_ratio
from t
group by employee_id;
这将生成一个介于0和1之间的数字。如果你真的想要一个百分比,你可以乘以100;我发现这个比率更容易理解

这使用了一个MySQL扩展,其中布尔表达式的结果在数字上下文中被视为一个数字,0表示false,1表示true。更详细的方法使用ANSI标准功能:

avg(case when present_id = 1 then 1.0 else 0 end) as present_ratio

这不能满足我的要求。现在的比率+缺席的比率+迟到的比率应该是100。但它给出了不同的结果。这就是我给出示例输出的原因。这里我只给了一个员工的条目。将会有很多员工。@hmamun。它加起来是“1”,而不是“100”。如果你想要100,那么按照我在答案中的解释乘以100。此查询是根据您的问题所暗示的每个员工进行的(您的结果集有一列员工id)。它无法满足我的要求。现在的比率+缺席的比率+迟到的比率应该是100。但它给出了不同的结果。这就是我给出示例输出的原因。这里我只给了一个员工的条目。将会有很多员工。@hmamun。它加起来是“1”,而不是“100”。如果你想要100,那么按照我在答案中的解释乘以100。此查询是根据您的问题所暗示的每个员工进行的(您的结果集有一列员工id)。