1

我有一个存储过程,它基于以下内容返回记录Department ID

Employee Name                ManagerID         SupervisorID                ID  
    John Smith                  1                     1                      1  
    Tom Jones                   1                     2                      2  
    Robert Thompson             1                     2                      3
    Jennifer Stevens            1                     4                      4  

我想缩进返回的记录如下:

  • 如果 ManagerID = ID(无缩进)
  • 如果 SupervisorID = ID(缩进 2 个空格)
  • 其他(缩进 4 个空格)*

就像是:

John Smith  
   Tom Jones  
       Robert Thompson  
   Jennifer Stevens

我将如何做到这一点?

4

3 回答 3

3

怎么样:

SPACE (
CASE
  WHEN ManagerID = ID THEN 0
  WHEN SupervisorID = ID THEN 2
  ELSE 4
  END
) + [Employee Name] AS [Employee Name]
于 2012-10-15T16:36:33.007 回答
1

使用 CASE 语句?

EmployeeName = 
    CASE ManagerID
        WHEN 1 THEN [Employee Name]
        WHEN 2 THEN '  ' + [Employee Name]
        ELSE '    ' + [Employee Name]
    END 

(注:伪代码,未经测试)

编辑:CASEEND CASE.

CREATE TABLE Employee
 (EmployeeID int,
  EmployeeName nvarchar(25),
  ManagerID int)
;

INSERT INTO Employee
VALUES (1, 'John Smith', 1)
;

INSERT INTO Employee
VALUES (2, 'Bill Gates', 2)
;

INSERT INTO Employee
VALUES (3, 'Adam Smith', 2)
;

INSERT INTO Employee
VALUES (4, 'John Gates', 3)
;

INSERT INTO Employee
VALUES (5, 'Jake Smith', 4)
;

SELECT 
  EmployeeName = 
    CASE ManagerID
      WHEN 1 THEN EmployeeName
      WHEN 2 THEN '  ' + EmployeeName
      ELSE '    ' + EmployeeName
    END 
FROM Employee

输出:

EmployeeName
-----------------------------
John Smith
  Bill Gates
  Adam Smith
    John Gates
    Jake Smith
于 2012-10-15T16:27:22.683 回答
0

如果您想允许任意数量的级别(例如,每个人都只是一个老板,那么这可以是任何深度),您必须使用递归 CTE。此外,可能需要编写查询,以便它根据关系正确地重新排序(这样,在您的示例数据中,Robert 的行总是出现在 Tom 之后,而不是第一个或任何其他人之后)。

这是一个展示它是如何工作的小提琴;我添加了更多人以使其更有趣。

WITH EmployeeHierarchy AS (
  SELECT
    0 [Level],
    CAST(1 AS float) [Step],
    CAST(ROW_NUMBER() OVER (ORDER BY e.ID) AS float) [Sort],
    e.*
    FROM Employee e
    WHERE e.BossID IS NULL
  UNION ALL
  SELECT
    h.[Level]+1,
    h.[Step]/(SUM(1) OVER ()+1),
    h.[Sort]+(ROW_NUMBER() OVER (ORDER BY e.ID))*(h.[Step]/(SUM(1) OVER ()+1)),
    e.*
    FROM Employee e
    JOIN EmployeeHierarchy h ON (h.ID = e.BossID)
)
SELECT SPACE(h.Level*2)+h.Name [Employee Name], h.BossID, h.ID
  FROM EmployeeHierarchy h
  ORDER BY h.Sort
于 2012-10-15T17:08:47.847 回答