Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать количество вложенных строк. Рекурсия, Рекурсия, дерево, количество дочерних 
:(
    Опции темы
interv
  Дата 14.4.2014, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



Есть таблица 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;
    }


Это сообщение отредактировал(а) interv - 14.4.2014, 09:50
PM MAIL   Вверх
Akina
Дата 14.4.2014, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.