2011-05-04 2 views
1

특정 순서로 표시하려는 간단한 직원 테이블이 있습니다. 나는 같은 결과를 얻기위한 대안적인 해결책 (또는 더 나은 해결책)이 있는지 알아보고 싶다. T-SQL 스크립트는 다음과 같습니다.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에서 팀 관리자에게 다른 결과가 발생할 수 있습니다.

+0

일치해야하는 비즈니스 규칙은 무엇입니까? managerID와 employeetype이 다를 것입니다 (그렇지 않으면 하나만 스키마에 있어야 함). 그러면 정렬이 달라집니다. – Mark

답변

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 

당신은 당신이

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 

처럼 할 수 또는 당신은

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

이 정렬 순서를 정의 EmpType 년대와 테이블을 사용할 수 있습니다 EmployeeType에 따라 종류를 설정하려면 "보편적 인"솔루션이 아닙니다. 귀하의 예에서는 직원 유형뿐만 아니라 Manager_id도 변경할 수 있습니다. 비슷한 결과를 얻으려면 계층 구조 수준으로 주문해야합니다. 이 경우 먼저 관리자 세트가되고 직원이됩니다. Employee가 다른 managerId를 갖게되면 같은 레벨에 머물러있게됩니다.

관련 문제