#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. Если у сотрудника будет другой идентификатор менеджера, он останется на том же уровне.