Tsql 在T-SQL中显示表的替代解决方案

Tsql 在T-SQL中显示表的替代解决方案,tsql,sorting,Tsql,Sorting,我有一个简单的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 (Empl

我有一个简单的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

行先由经理排序,然后由employeeID排序。我担心的是,在我的解决方案中,它是按EmployeeType列排序的。改为按ManagerId列对其进行排序是否更好?因为员工类型将来可能会发生变化,比如从经理到团队经理,这可能会导致不同的结果

如果管理者的标准是列
ManangerID为空
,则可以按顺序使用大小写来首先获取管理者

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

如果管理者的条件是列
ManangerID为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
没有“通用”的解决方案。在您的示例中,不仅员工类型,而且经理id也可以更改。 若你们需要得到类似的结果,你们应该按照层次结构的级别排序。在这种情况下,首先设置经理,然后设置员工。如果员工将有另一个managerId,它将保持在同一级别。

没有“通用”解决方案。在您的示例中,不仅员工类型,而且经理id也可以更改。
若你们需要得到类似的结果,你们应该按照层次结构的级别排序。在这种情况下,首先设置经理,然后设置员工。如果员工将有另一个managerId,则它将保持在同一级别。

您需要匹配的业务规则是什么-managerId和employeetype将不同(否则,架构中应该只有一个),因此排序将不同您需要匹配的业务规则是什么-managerId和employeetype将不同(否则,您的架构中应该只有一个)因此排序将有所不同