Mysql Подсчитывать данные строки по каждой дате, но дата данных ограничена - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть таблица "активность", подобная этой

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) ) вот так

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.

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

можно ли считать total_no_activity только с таблицей "activity"?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я бы предложил:

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 голосов
/ 17 февраля 2020
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 значения, которые присутствуют в исходной таблице хотя бы один раз (может быть, даже из интересующего периода) используйте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...