SQL报告,将多个数据集合并为移动平均值

时间:2012-10-12 12:23:48

标签: sql ssrs-2008

嗨,我对SQL报道很陌生,但我有一个看似很难的问题(至少我认为是这样;-)让我们希望有人可以证明我错了!) 我正在创建一个“年初至今”的报告,其中包含12个月的移动平均值。这要求我查询最多23个月前的所有可用结果(因为我的报告中的oldes值是12个月前)。 我现在解决它的方式(有效)是制作24个数据集,每个数据集在一个月前查询。所以本月ds1:查询,上个月ds2:查询... ds24:23个月前查询。

问题是:有没有办法在单个查询中组合它?

表格如下:

DATE       ID    VALUE        DESCRIPTION
1/1/2012   12    'Text here'  'Text here'

(简化,有一些ineer连接和一些更多参数)查询如下:

SELECT COUNT  Date, ID, Value, Description 
FROM Table 
WHERE (Date BETWEEN @parFrom AND DATEADD(month, 1, @parFrom)) 
AND description = 'Text here' 

我需要这个的原因是因为当你没有包含所有可用值的数据集时,显然不可能制作图表。

希望有人可以提供帮助:)

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找将您的所有表格合并为一个表格。 query.AM我是对的。如果是的话。

例如,可以通过联合查询来组合多个查询的结果。这是一个查询。

SELECT colA, colB FROM tableA WHERE colA > 1
UNION
SELECT colX, colA FROM tableB WHERE colA > 1

这里有一些样本可以帮到你。

http://msdn.microsoft.com/en-us/library/ms180026%28v=sql.90%29.aspx

http://www.tizag.com/sqlTutorial/sqlunion.php

http://blog.sqlauthority.com/2009/03/11/sql-server-difference-between-union-vs-union-all-optimal-performance-comparison/

答案 1 :(得分:0)

我喜欢在这样的查询中使用Common Table Expressions作为日期。根据你的源表,这可能不是最简单的答案,但它很好地用于所有目的:

CREATE TABLE #Events
(id INT IDENTITY,
EventTypeID INT,
EventDate DATETIME)

INSERT INTO #Events
         (  EventTypeID, EventDate )
VALUES
         (   32,  '2012-1-1' ),
         (   4,  '2012-1-1' ),
         (   5,  '2012-2-3' ),
         (   4,  '2012-2-25' ),
         (   34,  '2012-3-1' ),
         (   4,  '2012-4-3' ),
         (   4,  '2012-4-16' )

;
WITH  MonthsCTE
        AS ( SELECT
               1 AS ID ,
               DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS MonthStart ,
               DATEADD(YEAR, -1,
                       DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS YearEarlier
             UNION ALL
             SELECT
               ID + 1 ,
               DATEADD(MONTH, -1, MonthStart) ,
               DATEADD(YEAR, -1, DATEADD(MONTH, -1, MonthStart))
             FROM
               MonthsCTE
             WHERE
               DATEADD(MONTH, -1, MonthStart) > DATEADD(YEAR, -1, GETDATE())
           )
   SELECT
      MonthStart ,
      COUNT(#Events.EventTypeID)  AS TotalOccurances,
      COUNT(#Events.EventTypeID) /12 AS AverageOccurances
   FROM
      MonthsCTE
   LEFT OUTER JOIN #Events
   ON #Events.EventDate BETWEEN YearEarlier AND MonthStart
      AND #Events.EventTypeID = 4
   GROUP BY
      MonthStart


      DROP TABLE #Events

上面,我正在建立一个CTE(如果您不熟悉它们,请考虑临时表),包括过去十二个月和一年前的日期。

然后第二个查询将该表连接到您的数据,允许任何数据落在CTE中的字段之间。