2015-07-20 275 views
-1

我在報告中有一個變量,它包含2個可能的值:「每月」和「每日」。我怎樣才能把這個變量(讓我們稱之爲@reportModel)。我認爲它應該在GROUP BY子句的某個地方,但不知道它應該是什麼樣子。SSRS每月/每日報告

DECLARE @reportModel VARCHAR(10) 
SET @reportModel = 'monthly' 

SELECT P.product, SUM(O.price * O.quantity), O.orderDate 
FROM Products AS P 
INNER JOIN Orders AS O ON P.ID = O.ID 

而現在呢?

回答

0

如何存儲過程來處理這個問題,像.....

CREATE PROCEDURE rpt_GetData 
    @reportModel VARCHAR(10) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @Sql NVARCHAR(MAX); 

IF (@reportModel = 'daily') 
    BEGIN 
    SET @Sql = N' SELECT P.product 
         , SUM(O.price * O.quantity) AS Total 
         , O.orderDate 
       FROM Products AS P 
       INNER JOIN Orders AS O ON P.ID = O.ID 
       GROUP BY P.product , O.orderDate' 
    Exec sp_executesql @Sql 
    END 
ELSE IF (@reportModel = 'monthly') 
    BEGIN 
     SET @Sql = N' SELECT P.product 
          , SUM(O.price * O.quantity) AS Total 
          , MONTH(O.orderDate) AS [Month] 
        FROM Products AS P 
        INNER JOIN Orders AS O ON P.ID = O.ID 
        GROUP BY P.product, MONTH(O.orderDate)' 
    Exec sp_executesql @Sql    
    END 

END 
+0

我寧願拋出一個異常,而不是'打印'。另外值得一提的是,這個執行計劃可能會很糟糕。 – DavidG

+0

哦,這也是返回不同的數據格式 - 「DATETIME」列與「INT」。 – DavidG

+0

@DavidG你不需要在這裏除了/錯誤,它只有一個無效的輸出,一些信息性的消息是足夠的我認爲,也可以在SSRS中處理不同的輸出/格式很容易看不到任何理由,我們應該使它完全複雜。這個過程的好處在於,所有重大的數據處理都是靠近數據源完成的,只需要所需的數據就可以完成,並且呈現(格式)可以在報告應用程序中處理,因爲它應該是:) –

0

我會把它在集團在表格或圖表中的表達,而不是在查詢中做。

=IIF(Parameters!reportModel.Value = "monthly", Month(Fields!orderDate.Value), Fields!orderDate.Value) 

如果你寧願做查詢,不想等待DBA可以避開部署存儲過程(更不用說維護它,每當有一個變化),你可以用你的參數例如:

SELECT P.product, SUM(O.price * O.quantity), 
CASE WHEN @reportModel = 'monthly' THEN CAST(MONTH(O.orderDate) AS VARCHAR(12)) 
    ELSE CAST(O.orderDateAS VARCHAR(12)) END AS DT 
FROM WORKFLOW_SHARED.MAIN.VW_CLAIMSOVERPAYMENT 
WHERE DATECOMPLETED > '7/1/2015' 
GROUP BY P.product, 
CASE WHEN @reportModel = 'monthly' THEN CAST(MONTH(O.orderDate) AS VARCHAR(12)) 
    ELSE CAST(O.orderDateAS VARCHAR(12)) END 

這樣您就不必維護兩個單獨的報告。

+0

這可能會很慢。想象一下每天有數千條記錄,這會將所有數據從數據庫中帶回來。 – DavidG

+0

@DavidG - 與SQL Server聚合數據和報表服務器的時間差別不大。我有數十份彙總數千(數百萬)條記錄的報告。 –

+1

我很抱歉,但是在數據庫和客戶端應用程序中執行操作之間存在巨大差異。 – DavidG

0

添加此作爲答案,因爲我在@ M.Ali的回答中的評論中提到它。

所以我建議你稍微改變想法與這些選項之一。

  1. 兩個報告 - 只需每天報告一個報告,每月報告另一個報告。現在,您不必擔心複雜的SQL等。
  2. 製作2個存儲過程,其中一個存儲日期爲GROUP BY,每月存儲一個。然後在你的SSRS數據集,爲您創建SQL基於參數選擇的程序的表達式:

    =IIf(Parameters!reportModel.Value = "monthly", "GetMonthlyData", "GetDailyData") 
    
-1

怎麼樣簡單的東西像這樣

select 
    P.product 
    ,Total = sum(O.price * O.quantity) 
    , O.orderDate 
from 
    Products as P 
    inner join Orders as O on P.ID = O.ID 
where 
    @reportModel = 'daily' 

union all 

select 
    P.product 
    ,Total = sum(O.price * O.quantity) 
    ,[Month] = MONTH(O.orderDate) 
from 
    Products as P 
    inner JOIN Orders as O on P.ID = O.ID 
group by 
    P.product 
    ,[Month] = MONTH(O.orderDate) 
where 
    @reportModel = 'monthly'