簡體   English   中英

SQL-創建存儲過程以遍歷日期以計算度量

[英]SQL - Creating stored procedure to loop through dates to calculate a measure

問題-我正在嘗試創建一個存儲過程,該過程將每季度運行一次,以計算移動的長達一年的每月歷史數據窗口中的指標(在這種情況下為總和),其中計算從第一個月的前三個月開始季度的一天,然后回溯該日期之前的一年。 因此,當程序在2015年4月1日運行時,我想計算從2014年1月1日到2014年12月31日的指標。 我想在2015年7月1日計算從2014年4月1日到2015年3月31日的指標。 並不斷。 (還必須包括該指標的基於歷史季度的計算。)

因為這是將定期運行的分析,所以我需要使該過程自動化,並且我認為某種循環是合適的。 我是SQL編程的新手-我的經驗幾乎完全是查詢-任何幫助將不勝感激。

就目前而言,我的數據看起來像這樣(對長度表示歉意):

ID              Month            Metric
123456          1/1/2011         7           
123456          2/1/2011         4          
123456          3/1/2011         8          
123456          4/1/2011         2         
123456          5/1/2011         0          
123456          6/1/2011         7  
123456          7/1/2011         4
123456          8/1/2011         0         
123456          9/1/2011         7
123456          10/1/2011        4
123456          11/1/2011        6           
123456          12/1/2011        0 
123456          1/1/2012         0           
123456          2/1/2012         2          
123456          3/1/2012         7          
123456          4/1/2012         3         
123456          5/1/2012         5          
123456          6/1/2012         6  
123456          7/1/2012         5
123456          8/1/2012         5         
123456          9/1/2012         1
123456          10/1/2012        5
123456          11/1/2012        2           
123456          12/1/2012        7 
123456          1/1/2013         5           
123456          2/1/2013         7          
123456          3/1/2013         5   
987654          1/1/2011         2           
987654          2/1/2011         0          
987654          3/1/2011         7          
987654          4/1/2011         5         
987654          5/1/2011         6          
987654          6/1/2011         8  
987654          7/1/2011         4
987654          8/1/2011         4         
987654          9/1/2011         3
987654          10/1/2011        3
987654          11/1/2011        3           
987654          12/1/2011        2 
987654          1/1/2012         5           
987654          2/1/2012         2          
987654          3/1/2012         3          
987654          4/1/2012         8         
987654          5/1/2012         5          
987654          6/1/2012         7  
987654          7/1/2012         6
987654          8/1/2012         0         
987654          9/1/2012         3
987654          10/1/2012        6
987654          11/1/2012        6           
987654          12/1/2012        6 
987654          1/1/2013         0           
987654          2/1/2013         4          
987654          3/1/2013         4 

編寫查詢以獲取任一季度(2012年第一季度)的結果非常容易:

SELECT DISTINCT ID, '01' AS Quarter, '2012' AS Year, SUM(Metric) AS Metric
FROM TABLE_1
WHERE (Month >= '1/1/2011' AND Month < '1/1/2012')
GROUP BY ID

輸出:

ID        Quarter    Year     Metric
123456    01         2012     49

為每個季度的分析編寫一個這樣的變體顯然是效率低下的(並且對於我要創建的東西還是不管用),因此目標是編寫某種循環來使過程自動化。

所需的輸出如下所示:

ID        Quarter    Year     Metric
123456    01         2012     49
123456    02         2012     39
123456    03         2012     44
123456    04         2012     44
123456    01         2013     51
987654    01         2012     47
987654    02         2012     48
987654    03         2012     49
987654    04         2012     47
987654    01         2013     57

我被困住了,缺乏對SQL編程的經驗被證明是一個挑戰。 有關如何進行的任何建議? 提前致謝!

SELECT DISTINCT ID, Qtr = DATEPART(qq,DATEADD(month, -15, [Month])), Yr = DATEPART(yy,DATEADD(month, -15, [Month])), Sum(Metric) AS Metric FROM TABLE_1 GROUP BY ID, DATEPART(qq,DATEADD(month, -15, [Month])), DATEPART(yy,DATEADD(month, -15, [Month]))

http://sqlfiddle.com/#!6/9275b/2

假設您的季度數據表如下所示:

CREATE TABLE QtrData(
   ID INT NULL, 
   Qtr INT NULL, 
   Yr INT NULL, 
   Metric INT NULL 
)

此過程將滿足您的需求:

CREATE PROC dbo.spInsertQuarterlyData 
   @Dt datetime
AS

DECLARE @CurrQtrDt DATETIME
DECLARE @RangeStartDt DATETIME
DECLARE @RangeEndDt DATETIME

SELECT @CurrQtrDt = DATEADD(qq, DATEDIFF(qq, 0, @Dt), 0)
SELECT @RangeStartDt = DATEADD(mm,-15,@CurrQtrDt)
SELECT @RangeEndDt = DATEADD(dd,-1,DATEADD(mm,-3,@CurrQtrDt))

INSERT INTO QtrData( ID, Qtr, Yr, Metric )
SELECT 
   ID,
   DATEPART(qq,@CurrQtrDt)-1,
   DATEPART(yyyy,@CurrQtrDt),
   SUM(Metric)
FROM Table_1
WHERE [Month] BETWEEN @RangeStartDt AND @RangeEndDt
GROUP BY ID

然后,您將安排一個SQL作業按季度執行此proc,並傳入GETDATE()作為參數。

要使用初始問題陳述中的歷史數據填充表,最簡單的方法是調用此proc遍歷歷史區域,如下所示:

DECLARE @Dt datetime
SET @dt = '1/1/2011'

WHILE @dt < GETDATE()
BEGIN
    EXEC dbo.spInsertQuarterlyData @dt
    SET @dt = DATEADD(mm,3,@Dt)
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM