2015-07-20 273 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'