Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > узнать количество вложенных строк. Рекурсия


Автор: interv 14.4.2014, 09:18
Есть таблица Objects (id, ParentObjectID, TypeObjectID), где
id - increment
ParentObjectID - указатель на родителя 
TypeObjectID - 1:подразделение, 2:Сотрудник

Нужно вывести все подразделения и количество сотрудников в нем.

Есть запрос:
Код

WITH Deps (ID, ParentID, CountEmps) 
AS (SELECT Dep.id, Dep.ParentObjectID, Count(Emp.id)
    FROM Objects AS Dep LEFT JOIN
         Objects AS Emp ON Dep.id=Emp.ParentObjectID AND Emp.TypeObjectID=2
    WHERE Dep.TypeObjectID = 1
    GROUP BY Dep.id, Dep.ParentObjectID)
SELECT * FROM Deps

, но он выдает только сотрудников в подразделении, однако у подразделения могут быть еще подразделения, и т.д.
Например этот запрос выдал
Код

1   NULL  0
2   1     9
3   1     3
4   1     4
5   2     3
6   3     6
7   5     5
8   5     12

Необходимо таже подсчитать количество сотрудников в подчиненных подразделениях:
Код

1   NULL  0+9+3+4+3+6+5+12
2   1     9+3+5+12
3   1     3+6
4   1     4
5   2     3+5+12
6   3     6
7   5     5
8   5     12


Обидно будет, если делать это программно или создавать хранимку =((

UPD:
Использую подсчет локально, хотелось бы чтоб SQL возвращал готовые данные
Код

    protected static int TempFunction(DataRow row)
    {
      int cnt = (int)row["CountEmps"];
      DataRow[] rows = row.Table.Select("ParentID=" + row["ID"]);
      foreach (DataRow subRow in rows)
        cnt += TempFunction(subRow);
      return cnt;
    }

Автор: Akina 14.4.2014, 10:07
Укажите версию сервера - это важно.
А вообще - покурите вот это: http://msdn.microsoft.com/en-us/library/ms175972.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)