问题 - 我正在尝试创建一个存储过程,该存储过程将按季度运行以计算每月历史数据的移动年度窗口的度量标准(在这种情况下,总和),其中计算从三个月前开始到本季度的第一天,并回顾该日期前一年。因此,当程序在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编程经验证明是一项挑战。有关如何进行的任何建议?提前谢谢!
答案 0 :(得分:0)
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]))
答案 1 :(得分:0)
假设您的季度数据表如下所示:
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