2017-08-16 76 views
2

我有一個查詢,我加入僱員表和日誌表以顯示每個員工的日誌。問題是我需要刪除那些重複的列值(僅顯示每個員工的第一行的emp細節)。有誰知道如何在Excel或SQL Server中執行它?使用Excel(或SQL)合併或刪除列中的重複值

SELECT e.Employee, e.Position, e.Dept, l.Actioner, s.Status, l.ActionDate 
FROM employee e 
LEFT JOIN logs l ON e.EmpNo = l.EmpNo 
INNER JOIN Status s ON l.StatusId = s.Id 
ORDER BY l.Employee, l.ActionDate 

原輸出

Employee |Position |Dept |Actioner |Action  |ActionDate 
emp1  |Manager |IT  |emp1  |Submit  |01/01/2017 
emp1  |Manager |IT  |emp2  |Verify  |01/02/2017 
emp1  |Manager |IT  |emp3  |Approve |01/03/2017 
emp2  |Supervisor |HR  |emp2  |Submit  |01/12/2017 
emp2  |Supervisor |HR  |emp3  |Verify  |01/13/2017 
emp2  |Supervisor |HR  |emp4  |Approve |01/14/2017 

所需的輸出

Employee |Position |Dept |Actioner |Action  |ActionDate 
emp1  |Manager |IT  |emp1  |Submit  |01/01/2017 
           |emp2  |Verify  |01/02/2017 
           |emp3  |Approve |01/03/2017 
emp2  |Supervisor |HR  |emp2  |Submit  |01/12/2017 
           |emp3  |Verify  |01/13/2017 
           |emp4  |Approve |01/14/2017 

注:我喜歡這是否可以使用Excel函數來解決。謝謝!

+0

正在使用的是何種版本的SQL Server? –

+1

如果您刪除這些值並重新排列表格,您將如何知道哪個操作屬於哪個員工? – RealCheeseLord

+0

@ZoharPeled SQL Server 2008 R2 –

回答

1

以下是2012年之前在SQL Server中執行此操作的一種方法(當引入LAG函數時)。

使用與ROW_NUMBER一個公共表表達式和CASE表達式返回只有第EmployeePositionDept

;WITH CTE AS 
(
    SELECT e.Employee, 
      e.Position, 
      e.Dept, 
      l.Actioner, 
      s.Status, 
      l.ActionDate, 
      ROW_NUMBER() OVER(PARTITION BY e.Employee ORDER BY l.Employee, l.ActionDate) As rn 
    FROM employee e 
    LEFT JOIN logs l ON e.EmpNo = l.EmpNo 
    INNER JOIN Status s ON l.StatusId = s.Id 
) 

SELECT CASE WHEN rn = 1 THEN e.Employee END As Employee, 
     CASE WHEN rn = 1 THEN e.Position END As Position, 
     CASE WHEN rn = 1 THEN e.Dept END As Dept, 
     l.Actioner, 
     s.Status, 
     l.ActionDate 
FROM CTE 
ORDER BY l.Employee, l.ActionDate 
+0

它的工作!我喜歡你! –

+0

很高興幫助:-) –