首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql按日期统计行数据,但数据日期很少

问Mysql按日期统计行数据,但数据日期很少
EN

Stack Overflow用户
提问于 2020-02-17 16:48:52
回答 2查看 41关注 0票数 0

我有一个这样的表"activity“

代码语言:javascript
复制
idEmployee  | activity | Date
1           | a        | 2019/01/01
1           | b        | 2019/01/01
2           | c        | 2019/01/01
2           | d        | 2019/01/01
1           | e        | 2019/01/02
2           | f        | 2019/01/03
1           | f        | 2019/01/03
3           | c        | 2019/01/01
4           | d        | 2019/01/03
1           | e        | 2019/01/02
2           | f        | 2019/01/03

我想像这样计算2019/01/01 - 2019/01/03没有活动的每个idEmpolyee (作为total_no_actitivity)的每个日期

代码语言:javascript
复制
idEmployee | total_no_activity
1          | 0
2          | 1 (2019/01/02
3          | 2 (2019/01/02,2019/01/03)
4          | 2 (2019/01/01,2019/01/02)

但我只能选择没有活动的idemployee,不能计算total_no_activity。

代码语言:javascript
复制
SELECT idEmployee, namaLengkap, date
FROM account LEFT JOIN timesheet USING (idEmployee)
WHERE NOT EXISTS (SELECT idEmployee
                  FROM timesheet
                  WHERE account.idEmployee = timesheet.idEmployee AND weekday(date) AND date                    between '2019/08/05' and '2019/08/09' AND idrole = '4' AND statusaktif = '1' )
ORDER BY idEmployee ASC

是否可以仅使用表"activity“来计算total_no_activity?

EN

回答 2

Stack Overflow用户

发布于 2020-02-17 17:02:33

代码语言:javascript
复制
SELECT idEmployee, 
       3 - COUNT(DISTINCT `Date`) total_no_activity
FROM account
WHERE `Date` BETWEEN `2019/01/01` AND `2019/01/03`
GROUP BY idEmployee

其中3是期间内的天数(含利息)。

如果某些idEmployee在感兴趣的时间段内根本没有记录,那么这个值将不会在输出中列出。

很遗憾,我需要在输出中列出没有记录的idEmployee

假设您需要源表中出现的所有idEmployee值至少一次(甚至在感兴趣的时间段之外)使用

代码语言:javascript
复制
SELECT account.idEmployee, 
       3 - COUNT(DISTINCT account.`Date`) total_no_activity
FROM (SELECT DISTINCT idEmployee FROM account) all_employees
LEFT JOIN account USING (idEmployee)
WHERE account.`Date` BETWEEN `2019/01/01` AND `2019/01/03`
GROUP BY account.idEmployee
票数 0
EN

Stack Overflow用户

发布于 2020-02-17 21:48:34

我建议:

代码语言:javascript
复制
select a.idEmployee,
       (datediff(params.date2, params.date1) + 1 - 
        count(distinct ac.date)
       ) as missing_days
from (select date('2019-01-01') as date1, date('2019-01-03') as date2
     ) params cross join   -- a convenience so we don't have to retype the constants
     accounts a left join
     activity ac
     on ac.idEmployee = a.idEmployee and
        ac.date >= params.date1 and
        ac.date <= params.date2
group by a.idEmployee;

为了防止输入错误并允许日期容易更改,这引入了一个具有日期值的子查询params。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60258745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档