2014-12-01 173 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 2014-12-01 16:56:13