Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 最近3个月的报表_Sql_Sql Server_Where_Rolling Computation - Fatal编程技术网

Sql 最近3个月的报表

Sql 最近3个月的报表,sql,sql-server,where,rolling-computation,Sql,Sql Server,Where,Rolling Computation,我有一个SQL语句(SQLServerManagementStudio),通过仪表板软件将数据传递到where语句中。用户可以选择年份(2013年或现在的2014年)和月份(以数值形式传递-因此12月=12)。我需要调整报表,使其符合我从他们选择的年份/月份中获得的最后3个月的位置。以前,b/c SQL语句只处理2013年的数据,它只是如下所示: YEAR(Main.ActivityDate) = '@Request.parmYear~' AND (Month(Main.ActivityDate

我有一个SQL语句(SQLServerManagementStudio),通过仪表板软件将数据传递到where语句中。用户可以选择年份(2013年或现在的2014年)和月份(以数值形式传递-因此12月=12)。我需要调整报表,使其符合我从他们选择的年份/月份中获得的最后3个月的位置。以前,b/c SQL语句只处理2013年的数据,它只是如下所示:

YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between ('@Request.parmMonth~'-2) and '@Request.parmMonth~')
通常情况下,parmYear=2013,然后无论他们选择哪个月,它都会在当前月份之前2个月

现在是2014年1月,我需要抓取2014年1月+2013年12月+2013年11月。我想知道如何调整语句以使其动态发生


想法?

有两种解决方案

  • 修改当前where语句并添加条件以检查此情况
  • 使用
    DATEADD
    函数。在评论和其他答案中呈现
修改要添加条件的位置

注意:可能存在小错误,因为我需要检查一月的月值是零还是1

例如:

WHERE 

(
'@Request.parmMonth~'-2 < 1 AND 
YEAR(Main.ActivityDate) = '@Request.parmYear~'-1 AND
Month(Main.ActivityDate) Between 
(12+'@Request.parmMonth~'-2) AND 12  
)
OR
(
YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between 
('@Request.parmMonth~'-2) and '@Request.parmMonth~'
)
在哪里
(
“@Request.parmonth~”-2<1和
年份(Main.ActivityDate)='@Request.parmYear~'-1和
月份(主要活动日期)介于
(12+'@Request.parmonth~'-2)和12
)
或
(
年份(Main.ActivityDate)='@Request.parmYear~'
和(月(主要活动日期)之间
(“@Request.parmonth~”-2)和“@Request.parmonth~”
)

我没有正在运行的SQL Server实例来测试此解决方案,但我建议构造一个日期,并使用内置函数计算上一个日期,因为这些函数已经考虑了多年等因素

    Declare @requestDate date = DATEFROMPARTS('@Request.parmYear', '@Request.parmMonth', 1);
    ...

    AND Main.ActivityDate between @requestDate AND DATEADD(month, -2, @requestDate )

详细信息。

不久前,我遇到了类似的问题。我的解决方案如下:

WHERE YEAR(Main.ActivityDate)*12 + YEAR(Month(Main.ActivityDate))
   BETWEEN '@Request.parmYear~'*12+'@Request.parmMonth~'-2 
       AND '@Request.parmYear~'*12+'@Request.parmMonth~'

您可以改进此解决方案,将一个参数作为
'@Request.parmYear~'*12+'@Request.parmonth~'

的结果发送给您。尝试使用DateAdd函数来减少您正在使用的RDBMS的月数,查找日期函数而不是解析年份和月份,只需使用数据数学来减少3个月即可。+1太棒了!不确定sp我知道这与其他解决方案相比如何,但还行。谢谢!这对我来说非常有效,速度也很快,但实际上,当我使用它时,表格是两个字段,一个是月份,另一个是年份。我认为这个案例也应该很有效。我只是意识到这个解决方案有一点错误。我会用一个例子来解释。如果月份要求,我会s 2014年1月,您将获得介于“2014/1/1”和“2013/11/1”之间的活动,但活动必须介于“2014/1/31”和“2013/11/1”之间。