회사 정책으로 인해 현재 작업중인 실제 쿼리를 제공 할 수 없지만 여기에 고장 및 일반적인 아이디어가 있습니다. 직원이 근무 중인지 여부와 근무하는 장소를 매일 기록하는 출석 기록부가 있습니다. 저는이 날짜와 그 직원이 5 교대로 근무한 날짜 사이에 이것을 요약하려고합니다. 내가 앉아있는 문제는 한 특정 직원이 A 직장에서 2 일 동안 일한 후 B 직장으로 옮겨 졌다는 것입니다. B 직장에서 며칠 후 직원은 다시 A 직장으로 옮겨졌습니다.
나의 시도에 대한 나의 결과는 직원이 1 월 1 일부터 A 직장에서 일하기 시작했고 단 2 교대로 1 월 10 일에 끝났다는 것을 보여 주었다. 작업 장소에 그룹이 있고 시작일과 종료일은 최소 및 최대 선택입니다.
SELECT att.Employee, att.Workplace, dte.BeginDate, dte.EndDate, shf.WorkShift FROM
(SELECT * FROM Attendance WHERE WorkDate BETWEEN '1-Jan' AND '30-Jan') att
CROSS APPLY (SELECT COUNT(Shift) WorkShift FROM Attendance WHERE WorkDate BETWEEN '1-Jan' AND '30-Jan' AND Employee = att.Employee AND WorkPlace = att.WorkPlace AND Shift = 'Worked') shf
CROSS APPLY (SELECT MAX(WorkDate) BeginDate, MIN(WorkDate) EndDate FROM Attendance WHERE WorkDate BETWEEN '1-Jan' AND '30-Jan' AND Employee = att.Employee AND WorkPlace = att.WorkPlace) dte
따라서이 직원 레코드는 다음과 같이 표시되어야합니다 (매우 나쁜 그리드에 대해 죄송합니다. 예쁘게 만드는 방법을 모르겠습니다. 더보기 좋게 편집 할 수 있습니다.)
| Name | Workplace | beginDate | endDate | WorkShift |
| Jane | WorkPlaceA | 1-Jan | 2-Jan | 2 |
| Jane | WorkPlaceB | 3-Jan | 8-Jan | 5 |
| Jane | WorkPlaceA | 9-Jan | 10-Jan | 2 |
출석 테이블은 다음과 같습니다.
| Name | Workplace | Date | Shift |
| Jane | WorkplaceA | 1-Jan | Worked |
| Jane | WorkplaceA | 2-Jan | Worked |
| Jane | WorkplaceB | 3-Jan | Worked |
| Jane | WorkplaceB | 4-Jan | Worked |
| Jane | WorkplaceB | 5-Jan | Worked |
| Jane | WorkplaceA | 6-Jan | Absent |
| Jane | WorkplaceA | 7-Jan | Absent |
| Jane | WorkplaceA | 8-Jan | Worked |
| Jane | WorkplaceB | 9-Jan | Worked |
| Jane | WorkplaceB | 10-Jan | Worked |
나는 당신이 CTE를 사용하여 이것을 성취 할 수 있다고 믿는다. 다음은 예상 값을 보여주는 샘플 작업 코드입니다.
;WITH CTE1 AS (
SELECT Employee, WorkPlace, TransactionDate,
ROW_NUMBER() OVER(PARTITION BY WorkPlace ORDER BY TransactionDate) AS WP,
ROW_NUMBER() OVER(ORDER BY TransactionDate) AS RN FROM Attendance WHERE Shift = 'Worked'),
CTE2 AS (SELECT Employee, WorkPlace, TransactionDate, WP, RN, WP-RN AS GB FROM CTE1),
CTE3 AS (SELECT Employee, WorkPlace, MIN(TransactionDate) AS TransactionDate, COUNT(1) AS Shifts FROM CTE2 GROUP BY Employee, WorkPlace, GB)
SELECT Employee, WorkPlace, TransactionDate AS [Start Date], DATEADD(DAY,Shifts - 1,TransactionDate) AS [End Date], Shifts FROM CTE3 ORDER BY TransactionDate ASC
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다