Альтернативное решение для отображения таблицы в T-SQL - PullRequest
1 голос
/ 04 мая 2011

У меня есть простая таблица сотрудников, которую я хочу отображать в определенном порядке. Я хочу выяснить, есть ли альтернативные решения (или лучшее решение) для достижения того же результата. Сценарий 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

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

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Если критерием для менеджера является этот столбец 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
0 голосов
/ 04 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...