MySQL基于2个条件计算列

MySQL基于2个条件计算列,mysql,Mysql,我试图从一个日志表中计算一个基本的“出勤”报告。我的日志表如下所示: TABLE logs id | date | log | ------------------------| 123 | 2018-01-01 | 1234 | 123 | 2018-01-02 | | // Missed log 123 | 2018-01-03 | 5678 | 456 | 2018-01-01 | 5678 | 456 | 2018-01-02 | 1234 | 456 | 20

我试图从一个日志表中计算一个基本的“出勤”报告。我的
日志
表如下所示:

TABLE logs
id  | date       | log  |
------------------------|
123 | 2018-01-01 | 1234 |
123 | 2018-01-02 |      | // Missed log
123 | 2018-01-03 | 5678 |
456 | 2018-01-01 | 5678 |
456 | 2018-01-02 | 1234 |
456 | 2018-01-03 | 1234 |
因此,空条目会导致错过日期

所需的
SELECT
结果如下:

id  | perc  |
------------|
123 | 0.666 |
456 | 1     |
我已经尝试了以下方法,但我不确定接下来该怎么办:

选择id,将(*)计数为有人值守,其中log不为NULL按id分组按有人值守的顺序

哪些是:

id  | attended |
---------------|
123 | 2        |
456 | 3        |
这让我有了一部分机会,但我不确定如何在其中添加
missed
列,然后计算百分比。稍后我将把结果加入一个“users”表,这样名称就可以与日志
id
s相关联。任何帮助都将不胜感激

“条件聚合”解决了这个问题,基本上是在
count()函数中放置一个
大小写表达式

SELECT
      id 
    , count(case when log IS NOT NULL then 1 end) AS attended 
    , count(case when log IS NULL then 1 end)     AS Missed
    , case when count(case when log IS NOT NULL then 1 end) > 0 then
           count(case when log IS NOT NULL then 1 end) / count(*)
           else 0
      end AS perc  
GROUP BY id 
ORDER BY attended
如果使用
count(*)
计算所有行,但如果计算一个可以为NULL的值,则不计算这些NULL。

条件聚合”解决了这个问题,基本上是在
count()
函数中放置一个
大小写表达式

SELECT
      id 
    , count(case when log IS NOT NULL then 1 end) AS attended 
    , count(case when log IS NULL then 1 end)     AS Missed
    , case when count(case when log IS NOT NULL then 1 end) > 0 then
           count(case when log IS NOT NULL then 1 end) / count(*)
           else 0
      end AS perc  
GROUP BY id 
ORDER BY attended

如果使用
count(*)
,则会对所有行进行计数,但如果对一个可以为NULL的值进行计数,则不会对这些NULL进行计数。

另一个答案中建议的CASE条件在这里是多余的。因此,您可以简化查询:

SELECT
      id 
    , COUNT(log) AS attended 
    , COUNT(*) - COUNT(log) AS missed
    , IF(COUNT(*) > 0, count(log) / COUNT(*), NULL) AS percentage
FROM
    logs
GROUP BY
    id 
ORDER BY
    attended

此外,我已经根据OP固定了百分比计算。

在另一个答案中建议的情况条件在这里只是多余的。因此,您可以简化查询:

SELECT
      id 
    , COUNT(log) AS attended 
    , COUNT(*) - COUNT(log) AS missed
    , IF(COUNT(*) > 0, count(log) / COUNT(*), NULL) AS percentage
FROM
    logs
GROUP BY
    id 
ORDER BY
    attended

此外,我已经根据OP固定了百分比计算。

这正是我需要的,谢谢!最后我发现我需要一个额外的
WHERE
子句。这正是我需要的,谢谢!最后我发现我需要一个额外的
WHERE
子句。