Альтернативное решение для отображения таблицы в T-SQL

#tsql #sorting

#tsql #сортировка

Вопрос:

У меня есть простая таблица employee, которую я хочу отобразить в определенном порядке. Я хочу выяснить, существуют ли альтернативные решения (или лучшее решение) для достижения того же результата. Сценарий T-SQL показан ниже:

 CREATE TABLE Employee(
 EmployeeID INT IDENTITY(1,1) NOT NULL,
 EmployeeName VARCHAR(255) NULL,
 ManagerID INT NULL,
 EmployeeType VARCHAR(20) NULL
)
GO

INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Brad',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('James',3,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Ray',null,'Manager');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Tom',8,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Neil',8,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Rob',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Paul',5,'Memeber');
INSERT INTO Employee (EmployeeName, ManagerID, EmployeeType)
VALUES ('Tim',null,'Manager');
GO
SELECT e.EmployeeType, e.EmployeeName AS [Team Member],    
  (SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e 
ORDER BY e.EmployeeType, e.EmployeeID
  

Строки упорядочиваются сначала по manger, затем по EmployeeID. Меня беспокоит то, что в моем решении она отсортирована по столбцу EmployeeType. Было бы лучше отсортировать ее по столбцу ManagerID вместо этого? Поскольку EmployeeType может быть изменен в будущем, скажем, с Manager на Team Manager, что может привести к другому результату!

Комментарии:

1. Какое бизнес-правило вам нужно сопоставить — ManagerID и employeetype будут отличаться (в противном случае в вашей схеме должно быть только одно), поэтому сортировка будет отличаться

Ответ №1:

Если критерием для менеджера является этот столбец ManangerID is null , вы можете использовать регистр в порядке по, чтобы сначала получить менеджеров.

 SELECT e.EmployeeType, e.EmployeeName AS [Team Member],    
  (SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e 
ORDER BY CASE WHEN E.ManagerID IS NULL THEN 0 ELSE 1 END, e.EmployeeID
  

Если вы хотите установить сортировку в зависимости от EmployeeType, вы можете сделать это следующим образом

 SELECT e.EmployeeType, e.EmployeeName AS [Team Member],    
  (SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e 
ORDER BY
  CASE EmployeeType
    WHEN 'Manager' THEN 0
    WHEN 'Memeber' THEN 1
    ELSE 2
  END, e.EmployeeID
  

Или вы можете использовать таблицу с EmpType, которые определяют порядок сортировки

 CREATE TABLE EmpType(EmployeeType VARCHAR(20) PRIMARY KEY, SortOrder INT)
GO
INSERT INTO EmpType VALUES('Manager', 1)
INSERT INTO EmpType VALUES('Memeber', 2)

SELECT e.EmployeeType, e.EmployeeName AS [Team Member],    
  (SELECT e2.EmployeeName FROM Employee AS e2 WHERE e2.EmployeeID = e.ManagerID) AS Manager
FROM Employee AS e 
  LEFT OUTER JOIN EmpType as et
    ON e.EmployeeType = et.EmployeeType
ORDER BY et.SortOrder, e.EmployeeID
  

Ответ №2:

«Универсального» решения не существует. В вашем примере может измениться не только тип сотрудника, но и Manager_id. Если вам нужно получить аналогичные результаты, вам следует упорядочить до уровня иерархии. В этом случае сначала будет установлен manager, затем employee. Если у сотрудника будет другой идентификатор менеджера, он останется на том же уровне.