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 つインデント)
  • Else (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 

(注: 疑似コード、テストされていません)

CASE編集:から削除されEND 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 に答える