mysql基于2个条件计算列

uyto3xhc  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(279)

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

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     |

我试过以下方法,但我不知道该怎么办: SELECT id, count(*) AS attended WHERE log IS NOT NULL GROUP BY id ORDER BY attended 这意味着:

id  | attended |
---------------|
123 | 2        |
456 | 3        |

这让我有一部分的方法,但我不知道如何添加一个 missed 列,然后计算百分比。稍后我将把结果连接到一个“users”表,这样就可以将名称与日志关联起来 id s。任何帮助都将不胜感激!

2nbm6dog

2nbm6dog1#

在另一个答案中建议的case条件在这里是多余的,因为count总是只计算非空记录。因此,您可以简化查询:

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固定了百分比计算。

nbnkbykc

nbnkbykc2#

“条件聚合”解决了这个问题,基本上你把一个 case expression 内部 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。

相关问题