난이 조인 table
(id
, employee_id
, device_id
, logged_time
) [간략화] 생체 인식 장치에서 종업원의 출석을 기록. 각 직원의 첫 번째 및 마지막 시간을 날짜별로 보여주는 보고서를 생성합니다.선택 항목 (들)
현재 각 직원의 첫 번째 및 마지막 시간을 날짜별로 가져올 수 있지만 각 직원의 첫 번째 및 마지막으로 device_id
개를 가져와야합니다. 항목은 로깅 된 시간의 순차적 순서가 아닙니다.
열이 동적으로 생성되어 수천 개의 조인으로 이어질 수있는 보고서 중 하나에서 조인을 사용하고 싶지는 않습니다. 또한 이들은 하위 쿼리이며 다른 세부 정보를 얻기 위해 다른 쿼리에 조인됩니다.
테이블의 샘플 설정 및 쿼리 http://sqlfiddle.com/#!9/3bc755/4
에서 첫 번째 그냥 두 번째는 출석 차트를 기반으로 나열 모든 직원
select
attendance_logs.employee_id,
DATE(attendance_logs.logged_time) as date,
TIME(MIN(attendance_logs.logged_time)) as entry_time,
TIME(MAX(attendance_logs.logged_time)) as exit_time
from attendance_logs
group by date, attendance_logs.employee_id
의 날짜별로 시작 및 종료 시간이 표시됩니다
0 : 날짜 범위 시도select
`attendance_logs`.`employee_id`,
DATE(MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END)) as date_2017_09_18,
MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END) as entry_2017_09_18,
MAX(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END) as exit_2017_09_18,
DATE(MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END)) as date_2017_09_19,
MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END) as entry_2017_09_19,
MAX(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END) as exit_2017_09_19
/*
* dynamically generated columns for dates in date range
*/
from `attendance_logs`
where `attendance_logs`.`logged_time` >= '2017-09-18 00:00:00' and `attendance_logs`.`logged_time` <= '2017-09-19 23:59:59'
group by `attendance_logs`.`employee_id`;
제공
case
을 사용하는 각 날짜의 최대 및 최소 logged_time
과 유사하게 device_id
을 선택하려고 시도했습니다. 여기서 logged_time
은 최대/최소입니다.
```MIN(case
when
`attendance_logs.logged_time` = MIN(
case when DATE(`attendance_logs`.`logged_time`)
= '2017-09-18' THEN `attendance_logs`.`logged_time` END
)
then `attendance_logs`.`device_id` end) as entry_device_2017_09_18 ```
이 invalid use of group by
날짜 별 동적 열에 대한 이유는 무엇입니까? 매우 "비협조적인"것으로 보인다 ... –
@RomanSusi, 기본적으로 쿼리의 결과는 "생성 된 보고서"(일부 변경 사항이 있음)이며이 기능은 비슷하지만 기능이 다른 여러 곳에서도 사용됩니다. 전체 월 또는 월에 대한 모든 직원의 일일 출석 데이터를 가져 와서 응용 프로그램 측면에서이 차트를 처리 (교대조, 일정 등에 관한 추가 계산 포함)하면 잠재적으로 복잡해지고 데이터가있을 때 시간과 메모리 문제가 발생할 수 있습니다. 거대한. 데이터베이스에서이 작업을 수행하면 확장이 잘 된 것 같습니다. 더 나은 방법에 대한 제안을 보내 주시면 감사하겠습니다. – Shuvo