SQL报告,组合多个数据集以实现移动平均

SQL报告,组合多个数据集以实现移动平均,sql,ssrs-2008,Sql,Ssrs 2008,您好,我对SQL报告非常陌生,但我似乎遇到了一个难题(至少我认为是;-),希望有人能证明我错了!) 我正在创建一份“年初至今”报告,其中包含12个月的移动平均值。这要求我查询23个月前的所有可用结果(因为我报告中的oldes值是12个月前的)。 我现在解决这个问题的方法(有效)是创建24个数据集,每个数据集比另一个数据集提前一个月查询。所以ds1:查询这个月,ds2:查询上个月。。。ds24:23个月前的查询 问题是:有没有一种方法可以在一个查询中组合这一点 该表如下所示: DATE

您好,我对SQL报告非常陌生,但我似乎遇到了一个难题(至少我认为是;-),希望有人能证明我错了!) 我正在创建一份“年初至今”报告,其中包含12个月的移动平均值。这要求我查询23个月前的所有可用结果(因为我报告中的oldes值是12个月前的)。 我现在解决这个问题的方法(有效)是创建24个数据集,每个数据集比另一个数据集提前一个月查询。所以ds1:查询这个月,ds2:查询上个月。。。ds24:23个月前的查询

问题是:有没有一种方法可以在一个查询中组合这一点

该表如下所示:

DATE       ID    VALUE        DESCRIPTION
1/1/2012   12    'Text here'  'Text here'
SELECT COUNT  Date, ID, Value, Description 
FROM Table 
WHERE (Date BETWEEN @parFrom AND DATEADD(month, 1, @parFrom)) 
AND description = 'Text here' 
(简化后,有一些内部联接和更多参数)查询如下:

DATE       ID    VALUE        DESCRIPTION
1/1/2012   12    'Text here'  'Text here'
SELECT COUNT  Date, ID, Value, Description 
FROM Table 
WHERE (Date BETWEEN @parFrom AND DATEADD(month, 1, @parFrom)) 
AND description = 'Text here' 
我之所以需要这样做,是因为当您没有包含所有可用值的数据集时,显然不可能生成图形


希望有人能帮上忙:)

我想您正在寻找将所有表格合并为一个表格的方法。我说得对吗。如果是的话

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

SELECT colA, colB FROM tableA WHERE colA > 1
UNION
SELECT colX, colA FROM tableB WHERE colA > 1
这里有一些样品可以帮助你


我喜欢在这样的查询中使用通用表表达式来表示日期。根据您的源表,这可能不是最简单的答案,但它完全适用于所有用途:

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(如果你不熟悉的话,可以考虑临时表),其中包括过去12个月和之前一年的日期


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

表中每月只有一个值吗?您好,谢谢,但是我的表没有现成的值。。我必须选择一些情况(x),其中一个陈述为真。例如,我的数据库中发生事件的记录数(我可以通过查询“事件”的值字段来确定)。其中(x)是的,这已经在我的查询中的联接条件中:
yourTable.Description='Text here'
如果您希望我的示例与您的数据更紧密地匹配,请编辑您的问题以提供表的相关详细信息d希望有一些示例数据。是的,我的查询将平均每个月跨多个值。嗨,Jamie,好的,这是我的表的极其简化的格式,包括一些虚构的数据,应该会给你一个很好的想法。表“事件”ID EventTypeID DATE 1 32 01/01/2012 2 4 01/20/2012 3 5 02/03/2012 4 02/15/2012 5 34 03/01/2012 6 4 04/03/2012 7 4 04/16/2012等我想查询事件类型编号为4的记录数的移动平均值。因此为11月,2月1日,3月无,4月2日。感谢您的回复!感谢!:)您的样本数据平均值将始终小于。12个月内的5:4事件将归零。答案已更改,以获取移动平均值和总发生次数。嘿,谢谢你的回答。。它不能像我想的那样工作。。我只能这样定义一列,对吗?我需要的结果显示如下:月值9月5日8月3日7月1日等。。。