Как использовать SUM (агрегатная функция) в отчете SSRS с «Скрыть дубликаты»? - PullRequest
0 голосов
/ 15 июня 2011

У меня есть отчет сетки SSRS со строкой заголовка, в которой SUM() s выбирает дочерние строки.

В запросе SQL одна внутренняя таблица Shift объединяется со многими таблицами Parts, что означает, что поле Hours в таблице Shift дублируется для каждой детали. Я использую функцию «Скрыть дубликаты» SSRS в ячейке «Часы», чтобы исправить это визуально. Проблема в том, что, хотя дубликаты скрыты, функция SUM() (в отчете, а не в запросе) по-прежнему включает их в суммирование часов.

Итак, у меня может быть следующая таблица и заголовок. Дубликаты часов (и Shift) скрыты, но все же (нежелательно) включены в суммирование.

SHIFT   HOURS     PART   ON HAND
=====   =======   ====   =======
        SUM:  8          SUM: 90
=====   =======   ====   =======
1st           3   X12Z        20
                  J23Z        10
2nd           1   Y36P        30
3rd           1   Q90F        30

Я упрощаю фактический отчет, поэтому отображение данных другим способом не вариант. Кроме того, они уже находятся в группе, поэтому я не уверен, что могу добавить еще одну группу. Как получить функцию SUM(), которая возвращает сумму показанных часов?

EDIT:

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

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Учитывая, насколько распространен этот формат в отчете, я ожидал, что будет больше ответов или, по крайней мере, лучший способ сделать это.Но, увы, мой метод следующий:

Вместо того, чтобы реализовать cursor и перебрать таблицу, запустите update для исходных результатов в хранимой процедуре.Он очищает значения дублированных полей (т. Е. Сдвиг, часы), где часть текущей строки не является частью первой строки, возвращенной для этого сдвига.Если в исходном запросе есть order by, включите его во вложенный select:

update @tempResults
set    shift = null, -- Shift is a duplicated field.
       hours = null, -- Hours is a duplicated field.
where  part <> -- The part number identifies the duplicates.
       (
           select top 1 part
           from  #tempresults t
           where #tempresults.shift = t.shift -- Parts were grouped by shift.
           -- order by    the same fields from the original select statement.
       )

По сути, формула:

  1. Обнулить поля в«родительская» таблица (1 в отношении 1: m).
  2. Установите update s where, используя поле идентификации дочерней таблицы.
  3. Установите select where с использованием идентифицирующего поля родительской таблицы.
1 голос
/ 15 июня 2011

Используйте хранимую процедуру. Продолжайте, как только вы начали помещать свой результат во временную таблицу #X. Откройте курсор на вашем результате и пройдитесь по строкам. Всякий раз, когда вы не получаете изменение в ваших идентифицирующих столбцах, установите часы равными нулю. Затем верните свой результат, и ваш отчет должен работать как есть.

...