Как сформулировать запрос, чтобы объединить список всех сотрудников под каждым менеджером в одной строке, вместо двух отдельных столбцов (менеджер и сотрудники), как на примере таблицы?
Для создания SQL запроса с использованием рекурсии, необходимо использовать команду WITH RECURSIVE, которая позволяет делать рекурсивные запросы.
Пример SQL запроса для объединения списка всех сотрудников под каждым менеджером в одной строке:
```
WITH RECURSIVE EmployeeTree AS (
SELECT EmployeeID, ManagerID, Name, CAST(Name AS VARCHAR(1000)) AS Employees
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ManagerID, e.Name, CONCAT(et.Employees, ', ', e.Name)
FROM Employees e
JOIN EmployeeTree et ON e.ManagerID = et.EmployeeID
)
SELECT ManagerID, MAX(Employees) AS Employees
FROM EmployeeTree
GROUP BY ManagerID
```
В данном примере таблица Employees содержит информацию о сотрудниках с полями EmployeeID, ManagerID и Name. Рекурсивный запрос EmployeeTree строит иерархию от менеджера к сотруднику, объединяя всех сотрудников под каждым менеджером в одной строке.
Далее используется команда GROUP BY для объединения всех сотрудников под каждым менеджером в одной строке.
То что ты хочешь - это excel-специфично, его формат отображения. Такого ты не получишь. <br/> Есть несколько вариантов как это можно сделать в один столбец. <br/> <br/> 1. В единственной строке отображай все ID <br/> <br/> <pre><code class="sql">select e.manager_id::text || ' - ' || array_agg(id)::text
from employees as e
where e.manager_id is not null
group by e.manager_id
order by e.manager_id;</code></pre> <br/> <br/> 2. Добавляй паддинг для каждой строки (пустые строки) <br/> <pre><code class="sql">with manager_groups as (
select manager_id::text, array_agg(' ' || id::text) as ids
from employees as e
where e.manager_id is not null
group by e.manager_id
order by e.manager_id
)
select
x.id
from (
select unnest(array_prepend(manager_id, ids)) as id
from manager_groups
) as x;</code></pre>