SQL Server 2008 SSRS один отчет нескольких наборов данных - PullRequest
2 голосов
/ 18 мая 2011

Я новичок в SSRS, и у меня есть один отчет, который должен переключаться между 3 различными запросами в зависимости от того, что пользователь хочет видеть, например, Расходные материалы, Сервис или Всего (оба вместе). Каков наилучший способ сделать это? 1001 *

Запросы ниже:

--Consumables 
SELECT COUNT(OrderId)             AS [Consumable_Order_Amount], 
       CONVERT(DATE, DateCreated) AS [Date], 
       CASE 
         WHEN orderheader.webref = '' THEN 'Call Centre' 
         ELSE 'Web' 
       END                        AS [Consumable_Order_Type] 
FROM   OrderHeader 
WHERE  ( CONVERT(DATE, DateCreated) BETWEEN @StartDate AND @EndDate ) 
GROUP  BY CONVERT(DATE, DateCreated), 
          CASE 
            WHEN orderheader.webref = '' THEN 'Call Centre' 
            ELSE 'Web' 
          END 

--Service 
SELECT COUNT(serviceId)           AS [Service_Order_Amount], 
       CONVERT(DATE, DateCreated) AS [Date], 
       CASE 
         WHEN serviceorder.webref = '' THEN 'Call Centre' 
         ELSE 'Web' 
       END                        AS [Service_Order_Type] 
FROM   ServiceOrder 
WHERE  ( CONVERT(DATE, DateCreated) BETWEEN @StartDate AND @EndDate ) 
GROUP  BY CONVERT(DATE, DateCreated), 
          CASE 
            WHEN serviceorder.webref = '' THEN 'Call Centre' 
            ELSE 'Web' 
          END 

--Total           
;

WITH [Total_Order_Amount] 
     AS (SELECT orderid     AS [ID], 
                datecreated AS [Date], 
                webref      AS [WebRef] 
         FROM   orderheader 
         UNION 
         SELECT serviceid   AS [ID], 
                datecreated AS [Date], 
                webref      AS [WebRef] 
         FROM   serviceorder) 
SELECT COUNT(id)                  AS [Service_Order_Amount], 
       CONVERT(DATE, date) AS [Date], 
       CASE 
         WHEN webref = '' THEN 'Call Centre' 
         ELSE 'Web' 
       END                        AS [Service_Order_Type] 
FROM   [Total_Order_Amount] 
WHERE  ( CONVERT(DATE, date) BETWEEN @StartDate AND @EndDate ) 
GROUP  BY CONVERT(DATE, date), 
          CASE 
            WHEN webref = '' THEN 'Call Centre' 
            ELSE 'Web' 
          END 

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Вы на самом деле не хотите иметь 3 сетки, так как вам нужно было бы поддерживать их отдельно, скажем, следует добавить новый столбец.Однако если вы уверены, что запросы будут всегда иметь одинаковые столбцы, вы можете просто использовать хранимый процесс, который решает, какой запрос выполнить.Хорошо, здесь есть отдельные проблемы, касающиеся производительности и планов выполнения для такого процесса (мы можем перейти к этому позже).

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

Я нашел самое простое и чистое решение - передавать параметры в запрос выбора в зависимости от типа отчета в сочетании с оператором case в предложении where для фильтрации различных типов отчетов в памяти. Я отмечу это как ответ, если нет никаких возражений! Спасибо за вашу помощь.

WITH [Total_Order_Amount] 
     AS (SELECT orderid     AS [ID], 
                datecreated AS [Date], 
                webref      AS [WebRef], 
                'Consumable'AS [ReportType] 
         FROM   orderheader 
         UNION 
         SELECT serviceid   AS [ID], 
                datecreated AS [Date], 
                webref      AS [WebRef], 
                'Service'   AS [ReportType] 
         FROM   serviceorder) 
SELECT COUNT(id)           AS [Order_Amount], 
       CONVERT(DATE, DATE) AS [Date], 
       CASE 
         WHEN webref = '' THEN 'Call Centre' 
         ELSE 'Web' 
       END                 AS [Order_Type] 
FROM   [Total_Order_Amount] 
WHERE  ( CONVERT(DATE, DATE) BETWEEN @StartDate AND @EndDate ) 
       AND [ReportType] = CASE @ReportType 
                          WHEN 1 THEN 'Consumable' 
                          WHEN 2 THEN 'Service' 
                          ELSE [ReportType] 
                        END 
GROUP  BY CONVERT(DATE, DATE), 
          CASE 
            WHEN webref = '' THEN 'Call Centre' 
            ELSE 'Web' 
          END 
0 голосов
/ 18 мая 2011

Почему бы не создать параметр для отчета со списком предопределенных параметров, которые сопоставляются с каждым запросом. Этот параметр затем может быть передан в хранимую процедуру, и он может определить, какой подзапрос должен возвращаться.

Например: создайте параметр отчета с именем QueryOption с типом данных Integer,
Добавьте доступные значения Consumables, Service и Total со значениями 1,2 и 3. Установите значение по умолчанию 1, 2 или 3, если вы хотите автоматически выбрать опцию для пользователя.

Измените хранимую процедуру, чтобы использовать параметр QueryOption, чтобы определить, какой подзапрос должен возвращаться.

IF @QueryOption = 1
BEGIN
    SELECT 'Consumables' -- Add consumables query here
END
IF @QueryOption = 2
BEGIN
    SELECT 'Service'    -- Add Service query here
END
IF @QueryOption = 3
BEGIN
    SELECT 'Total'      -- Add Total query here
END

В свойствах DataSet для хранимой процедуры обязательно обновите поля, чтобы параметр QueryOption автоматически добавлялся.
Пока имя параметра для sp совпадает с именем параметра отчета, значение параметра будет введено в хранимую процедуру.

...