Иерархические SQL-запросы, SSRS 2008 и столбцы суммирования - PullRequest
1 голос
/ 01 апреля 2011

Я создаю отчет SSRS, и у меня возникли проблемы с выяснением, как его реализовать.

Во-первых, вот основная структура данных:

  • Уровень 1а
    • Уровень 2a
    • Уровень 2b
    • Уровень 2c
      • Уровень 3a
  • Уровень 1b
  • Уровень 1с

В базе данных каждый уровень имеет идентификатор и идентификатор родителя, где все родительские идентификаторы в корне (родители уровня 1) равны 0. Кроме того, каждый уровень имеет столбец с числовым значением. Например, я мог бы иметь:

Level1a
ParentId = 0
Id = 1
DataValue = 42

Level2a
ParentId = 1
Id = 2
DataValue = 1

В настоящее время я реализовал общее табличное выражение для получения иерархической структуры и уровней данных:

WITH cteTable(id, parentId, data, level) AS 
(SELECT id, 
        parentId, 
        data, 
        1 AS level 
FROM sampleTable 
WHERE (parentId = 0) 
UNION ALL 
SELECT b.id, 
       b.parentId, 
       b.data, 
       c.level + 1 AS Expr1 
FROM sampleTable AS b 
INNER JOIN cteTable AS c ON b.parentId= p.id
) 
SELECT id, 
       parentId,  
       data, 
       level 
FROM cteTable

Таким образом, с примерами данных из ранее, результаты запроса будут:

+----+----------+------+-------+
| id | parentId | data | level |
|----+----------+------+-------+
| 1  | 0        | 42   | 1     |
| 2  | 1        | 1    | 2     |
+----+----------+------+-------+

Отсюда мне нужно создать отчет, который суммирует данные на корневом уровне. Например, в отчете будет показано, что сумма данных для идентификатора 1 равна 43. Одна вещь, которую я не знаю наверняка, - насколько глубоки уровни - в некоторых случаях не будет дочерних уровней, а в других - дерево. несколько уровней глубиной.

Есть два варианта, которые я сейчас рассматриваю. Одним из них является создание детализированного отчета, который будет показывать данные на каждом уровне с суммой, где это возможно. Например:

-Level1a SUM_LEVEL2_AND_LEVEL1a_DATA
   Level2a DATA
   Level2b DATA
  -Level2c SUM_LEVEL3_AND_LEVEL2c_DATA 
      Level3a DATA
Level1b DATA
Level1c DATA

Другой способ - суммировать данные в корне и показать простую таблицу в отчете только с родительскими итогами. Например:

Level1a SUM_LEVEL1A_AND_ALL_CHILDREN_DATA
Level1b SUM_LEVEL1B_AND_ALL_CHILDREN_DATA
Level1c SUM_LEVEL1C_AND_ALL_CHILDREN_DATA

Кажется, я не могу понять, как получить детальный отчет, работая с выполненным мною поисковым запросом (здесь есть ссылка , которая кажется полезной, но я просто не мог заставить его работать).

Изменение схемы базы данных не вариант.

Кто-нибудь знает о каких-либо хороших ресурсах, которые я мог бы использовать, чтобы начать, или есть какие-либо идеи о том, как это сделать?

Дайте мне знать, если я что-то упустил ...

1 Ответ

0 голосов
/ 14 мая 2011

Я наконец нашел решение для этого.

Хорошим началом было общее табличное выражение (CTE).Единственное изменение, которое я внес в него, было в рекурсивном определении - вместо того, чтобы собирать идентификатор непосредственного родителя для каждого ребенка, я назначал ему идентификатор деда (родительский идентификатор, который имел непосредственный родитель).Это означало, что каждому дочернему элементу был назначен конечный родительский идентификатор вместо того, чтобы двигаться вверх только на один шаг в иерархии.Оттуда было довольно просто использовать это в отчете.

Я поместил CTE в собственную хранимую процедуру - единственная цель - вернуть всю иерархию.Оттуда я создал другую хранимую процедуру, которая объединила CTE с другой хранимой процедурой.В это время я применил фильтры и возвратил окончательный набор результатов.

...