sql server查询-n次迭代后的透视

sql server查询-n次迭代后的透视,sql,sql-server,Sql,Sql Server,我有一个包含两列的表: 'Employee' 'ReportsTo' 1 2 1 3 1 4 2 5 2 6 3 7

我有一个包含两列的表:

'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

这将适用于您的示例表,但不适用于这样的表,需要更复杂的查询:

Employee  ReportsTo
--------  ---------
12        13
13        12
在n次迭代之后,它不被称为pivot

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

这将适用于您的示例表,但不适用于这样的表,需要更复杂的查询:

Employee  ReportsTo
--------  ---------
12        13
13        12
在n次迭代之后,它不被称为pivot

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

您确定这一行是2->4,5,8,9,10,而不是2-->4,5吗?如果是,为什么选择8,9,10这不是旋转。这是一个分层查询。您确定这一行是2->4,5,8,9,10,而不是2-->4,5吗?如果是,为什么选择8,9,10这不是旋转。这是一个层次化的查询。感谢您的回复,并为这个主题感到抱歉,因为我没有得到合适的行来描述我的问题。但我的问题是这些表有N个组合数。如果您能用表格给出解决方案,我将不胜感激。提前感谢N个组合是什么意思?请给出一个例子谢谢你的回复,很抱歉我没有得到合适的文字来描述我的问题。但我的问题是这些表有N个组合数。如果您能用表格给出解决方案,我将不胜感激。提前感谢N个组合是什么意思?请举例说明