2014-12-01 3 views
0
SELECT E.SSN AS SocialSecurityNumber , 
     E.Name + ' ' + E.LastName AS FullName , 
     J.Job , 
     R.Date , 
     R.STime AS StartTime, 
     R.ETime AS EndTime, 
     CASE WHEN R.Date BETWEEN O.SDate AND O.EDate THEN O.OffID 
      ELSE 0 
     END AS OffReason 
FROM Resume AS R 
     INNER JOIN Employees AS E ON E.ID = R.EmpID 
     INNER JOIN Jobs AS J ON J.ID = E.JobID 
     LEFT JOIN Offs AS O ON E.ID = O.EmpID 
           AND R.Date BETWEEN O.SDate AND O.EDate 
WHERE E.JobLeft = 0 
     AND R.Date BETWEEN '2014-11-26 00:00:00' 
        AND  '2014-11-26 23:59:59' 
ORDER BY FullName 

이 사원 쿼리 재개 보고서 프로그램에 대한 SQL 쿼리를 작성했습니다. 직원이 일하기 시작했을 때 검색하고 작업하지 않을 이유가있는 경우 reasonId를 반환하거나 0을 검색하지 않는 경우 검색하려고합니다.이 쿼리에서 둘 이상의 이상이있을 때 결과는 중복 행을 반환합니다. 같은 종업원을위한 휴가 & 공휴일처럼. 나는 이것을 찾았지만 같은 상황을 발견 할 수 없다. 제거 된 행은 중요하지 않습니다. 하나의 근본은 나를 위해 충분하다. DISTINCT 키워드를 시도했지만 문제가 해결되지 않았습니다. 그래서 이것을 해결하기 위해 무엇을 할 수 있습니까?SQL 쿼리가 중복 행을 반환합니다.

답변

2

가장 간단한 예를 들어 MAX를 사용하여 만하는 이유 중 하나를 선택하는 것입니다 :

SELECT E.SSN      AS SocialSecurityNumber, 
     E.Name + ' ' + E.LastName AS FullName, 
     J.Job, 
     R.DATE, 
     R.STime     AS Start, 
     R.ETime     AS END, 
     MAX(CASE 
      WHEN R.DATE BETWEEN O.SDate AND O.EDate THEN O.OffID 
      ELSE 0 
      END)     AS OffReason 
FROM Resume AS R 
     INNER JOIN Employees AS E 
       ON E.ID = R.EmpID 
     INNER JOIN Jobs AS J 
       ON J.ID = E.JobID 
     LEFT JOIN Offs AS O 
       ON E.ID = O.EmpID 
       AND R.DATE BETWEEN O.SDate AND O.EDate 
WHERE E.Left = 0 
     AND R.DATE BETWEEN '2014-11-26 00:00:00' AND '2014-11-26 23:59:59' 
GROUP BY E.SSN, 
      E.Name + ' ' + E.LastName, 
      J.Job, 
      R.DATE, 
      R.STime, 
      R.ETime 
ORDER BY FullName 
+0

아이 일을) 대단히 = 감사합니다! – mimozz

관련 문제