J'ai une requête où je rejoins la table des employés et la table des journaux pour montrer les journaux par employé. Le problème est que j'ai besoin d'enlever ces valeurs de colonne de duplication (montrer les détails d'emp seulement à la première rangée par employé). Est-ce que quelqu'un sait comment le faire dans Excel ou SQL Server?
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
Sortie d'origine
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
Sortie désirée
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
NOTE: Je préfère si cela peut être résolu en utilisant la fonction Excel. Je vous remercie!
Voici une façon de le faire dans SQL Server avant 2012 (lorsque la fonction LAG
été introduite).
Utilisation d'une expression de table commune avec ROW_NUMBER
et d'une expression CASE
pour renvoyer uniquement le premier Employee
, Position
et Dept
:
;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