1

with句内でT1を使用しており、WITH内の句が完了した後にT1が宣言されているため、指定されたクエリはどのように正しいですか。

WITH T1(Emp,Manager,Salary) AS 
( 
SELECT tt2.[Emp],tt2.[Manager],tt2.[Salary] 
FROM [YourTable] AS tt1 
RIGHT OUTER JOIN [YourTable] AS tt2 ON tt1.[Emp]=tt2.[Manager] 
WHERE tt1.[Emp] is NULL 
UNION ALL 
SELECT r.[Emp],T1.[Manager],r.[Salary] 
FROM [YourTable] AS r 
INNER JOIN T1 ON r.[Manager]=T1.[Emp] 
) 
SELECT [Manager],SUM([Salary]) AS Salary 
FROM T1 
GROUP BY [Manager] 
ORDER BY SUM([Salary]) DESC

上記のクエリは、次の質問に対する回答です -

列(従業員、マネージャー、給与)を持つテーブルがあります。1 つの SQL でトップ レベルのマネージャーに対応するすべての従業員の総給与を計算する必要があります。例えば

Input table is : 
Emp Manager Salary 
A   T   10 
B   A   11 
C   F   13 
D   B   5 

結果は次のようになります:

Top-Lvl Manager Salary(agg) 
T   26 
F   13 

マネージャーと従業員の階層化は、複数のレベルに進むことができます。

4

3 に答える 3

2

編集 - オーバーキルを減らす

Declare @YourTable table (Emp varchar(25),Manager varchar(25),Salary int)
Insert into @YourTable values 
('A','T',10),
('B','A',11), 
('C','F',13),
('D','B',5) 

;with cteP as (
      Select Seq  = cast(1000+Row_Number() over (Order by Emp) as varchar(500))
            ,Emp=Manager
            ,Manager=cast(null as varchar(25))
            ,Lvl=1
            ,Salary = 0
      From  @YourTable 
      Where Manager Not In (Select Distinct Emp From @YourTable)
      Union  All
      Select Seq  = cast(concat(p.Seq,'.',1000+Row_Number() over (Order by r.Emp)) as varchar(500))
            ,r.Emp
            ,r.Manager
            ,p.Lvl+1
            ,r.Salary
      From   @YourTable r
      Join   cteP p on r.Manager = p.Emp)
Select TopLvl = A.Emp
      ,Salary = sum(B.Salary)
 from cteP A
 Join cteP B on (B.Seq Like A.Seq+'%')
 Where A.Lvl=1
 Group By A.Emp

戻り値

TopLvl  Salary
F       13
T       26
于 2016-12-20T12:15:20.000 に答える
1

おそらくDB内のテーブルである内部with T1参照。ステートメントの結果へのINNER JOIN T1 ON r.[Manager]=T1.[Emp]外部with T1参照。with

于 2016-12-20T11:42:45.970 に答える