1

嗨,我对 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' 

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

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

4

2 回答 2

0

我认为您正在寻找将所有表格合并为一张。查询。我是对的。如果是这样的话 。

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

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/

于 2012-10-12T12:44:10.990 回答
0

我喜欢在这样的查询中使用公用表表达式作为日期。根据您的源表,这可能不是最简单的答案,但它很适合所有目的:

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 中的字段之间的任何数据。

于 2012-10-12T13:47:21.130 回答