2012-10-12 91 views
1

嗨,我很新的SQL報告,但我有一個看似困難的問題(至少我認爲這是;-)讓我們希望有人能證明我錯了!) 我我正在創建一個「年迄今」報告,其中包含12個月的移動平均值。這要求我查詢長達23個月前的所有可用結果(因爲我報告中的oldes值是12個月前)。 我現在解決這個問題的方法是:製作24個數據集,每個數據集在一個月之前查詢。因此ds1:本月查詢,ds2:上個月查詢... ds24:23個月前查詢。SQL報告,結合多個數據集移動平均值

問題是:有沒有一種方法可以在單個查詢中結合使用?

表看起來是這樣的:

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' 

的原因,我需要的,這是因爲很明顯如果您沒有包含所有可用值的數據集,則無法創建圖表。

希望有人能幫助:)

+0

表中每月只有一個值? –

回答

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(想臨時表中,如果您不熟悉它們),其中包括過去的十二個月和一年前的日期。

然後第二個查詢將該表連接到您的數據,允許落在CTE中的字段之間的任何數據。

+0

您好感謝,但我的表沒有準備好使用的值。我必須選擇一個案例數量(x)陳述爲真。例如。我的數據庫中發生事件的記錄數(我可以通過查詢'事件'的值域來確定,其中(x)我想要移動平均數,所以本月可能有2個月,上個月1等直到24個月前。 – wouter

+0

是的,這已經在我的聯接條件查詢中:'yourTable.Description ='Text here''如果您希望我的示例更緊密地匹配您的數據,請編輯您的問題以提供表格的相關詳細信息,並希望一些示例數據。而且,是的,我的查詢將平均每月有多個值。 –

+0

嗨傑米,好吧,這裏是我的表的極簡化格式,包括一些虛構的數據,應該給你一個很好的主意。 表 「事件」 ID EventTypeID DATE 1 32 01/01/2012 2 4 2012年1月20日 3 5 02/03/2012 4 4 02/15/2012 5 34 03/01/2012 6 4 04/03/2012 7 4 04/16/2012 etc 我想查詢事件類型編號爲4的記錄數的移動平均數。所以這將是1月1日,2月1日,3月份沒有,4月份是2月份。 感謝您的回覆!欣賞它! :) – wouter

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/

+0

嘿感謝您的答案..它不工作,因爲我想..我只能這樣定義一列,是否正確? 我需要的結果顯示如下: 月份值 9月5日 8月3日 7月1日 等... – wouter