0

2列のテーブルがあります:

'Employee'               'ReportsTo'
1                            
2                            1
3                            1
4                            2
5                            2
6                            3
7                            3
8                            4
9                            4
10                           5

私はこのように戻りたいです:

'Employee' 'Reporting Officer'
1           2,3,4,5,6,7,8,9,10
2           4,5,8,9,10
3           6,7
4           8,9
5           10
6
7
8
9
10
4

1 に答える 1

3

これはサンプル テーブルでは機能しますが、次のようなテーブルでは機能しません (より複雑なクエリが必要になります)。

Employee  ReportsTo
--------  ---------
12        13
13        12

そして、それは「n 反復後のピボット」とは呼ばれません。

with cte as (
  SELECT 1 Employee,0 ReportsTo UNION ALL
  SELECT 2,1  UNION ALL
  SELECT 3,1 UNION ALL
  SELECT 4,2 UNION ALL
  SELECT 5,2 UNION ALL
  SELECT 6,3 UNION ALL
  SELECT 7,3 UNION ALL
  SELECT 8,4 UNION ALL
  SELECT 9,4 UNION ALL
  SELECT 10,5
),

cte2 as (
  SELECT ReportsTo e,Employee ro FROM cte
  UNION ALL
  SELECT a.e,b.Employee FROM cte2 a JOIN cte b ON a.ro = b.ReportsTo
)

SELECT
  Employee,
  ISNULL(LEFT(ro,LEN(ro)-1),'') as "Reporting Officer"
FROM (
  SELECT
    Employee,
    REPLACE(REPLACE((
      SELECT ro FROM cte2 x WHERE x.e=cte.Employee ORDER BY 1 FOR XML PATH('')
    ),'<ro>',''),'</ro>',',') ro
  FROM cte
) a

sqlfile

于 2013-02-03T12:06:47.620 に答える