programing

이 날짜 사이의 시간을 직원 할당 여부에 따라 그룹화하는 방법

sourcejob 2023. 8. 12. 10:14
반응형

이 날짜 사이의 시간을 직원 할당 여부에 따라 그룹화하는 방법

제가 생각하는 것보다 이게 더 쉬울 것 같은 느낌이 듭니다. 어쨌든 말이죠.

저는 회사 아이디별로 묶인 두 날짜 사이의 시간과 분 수를 알아야 합니다.그런 다음 세 개의 열이 필요합니다. 첫 번째는 해당 기간의 총 시간입니다.두 번째는 직원에게 할당된 총 시간이고 세 번째는 할당되지 않은 총 시간입니다.

내 테이블은 다음과 같습니다.

이드 company_id employee_id start_date end_날짜
1 25 2021-08-09 07:00:00 2021-08-09 15:00:00
8 25 46 2021-08-09 07:00:00 2021-08-09 15:00:00
15 25 141 2021-08-09 07:00:00 2021-08-09 15:00:00
22 25 100 2021-08-09 08:00:00 2021-08-09 16:00:00
29 25 80 2021-08-09 08:00:00 2021-08-09 16:00:00
90 1 2021-08-09 04:00:00 2021-08-09 10:00:00
94 1 2021-08-09 04:00:00 2021-08-09 11:00:00
98 1 2021-08-09 04:00:00 2021-08-09 18:00:00

여기서 저는 직원 4명에게 32시간이 할당되고 8시간은 할당되지 않은 25사의 총 40시간이 있습니다.

회사 1의 경우 총 27시간이 있으며, 이 중 0시간이 할당되고 27시간이 할당되지 않습니다.

제가 궁극적으로 찾고 있는 것은 이런 테이블입니다.

company_id 총_시간 총계_총계 총계_미계약의 start_date end_날짜
25 총 40시간 4명의 직원에게 32시간 할당 8시간 미지정 2021-08-09 2021-08-09
1 총 27시간 0시간 할당됨 지정되지 않은 27시간 2021-08-09 2021-08-09

저는 이런 것을 하는 것으로 시작했습니다.

SELECT 
    company_id, 
    CONCAT(TIME_FORMAT(SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, start_date, end_date))), '%H hours %i minutes'), ' assigned to ', COUNT(employee_id), ' employees') as total_assigned,
    DATE(start_date) as start_date,
    DATE(end_date) as end_date,
GROUP BY 
    company_id, DATE(start_date);

이렇게 하면 총 시간은 제공되지만 필요한 세 가지 차별화 요소는 제공되지 않으며, 필요한 것을 얻기 위해 쿼리를 변경하는 방법을 잘 모르겠습니다.

company_id 총계_총계 start_date end_날짜
1 0명의 직원에게 27시간 00분 할당 2021-08-09 2021-08-09
25 4명의 직원에게 40시간 00분 할당 2021-08-09 2021-08-09

어떤 도움이라도 주시면 대단히 감사하겠습니다.

당신이 어떤 db와 버전을 사용하고 있는지는 잘 모르겠지만, 이것이 당신이 필요로 하는 것 같습니다.문자열 연결만 추가하면 됩니다.

또 다른 불분명한 것은 start_와 end_date가 어떻게 계산되는지입니다. 그래서 저는 최소값과 최대값이 되어야 한다고 가정했습니다.

select company_id, 
       sum(TIMESTAMPDIFF(HOUR, start_date, end_date)) total_hours,
       sum(case when employee_id is not null then TIMESTAMPDIFF(HOUR, start_date, end_date) else 0 end) total_assigned,
       sum(case when employee_id is null then TIMESTAMPDIFF(HOUR, start_date, end_date) else 0 end) total_unassigned,
       min(date(start_date)),
       max(date(end_date))
  from test_data td
 group by company_id

언급URL : https://stackoverflow.com/questions/68722945/how-can-i-get-the-hours-between-these-dates-but-grouped-depending-on-whether-emp

반응형