2017-08-16 74 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

很高兴帮助:-) –