我想总结一个SQL查询的最近12个月的值。

问题是总结过去的12个月,而不是只花整整一年的时间。

因此,当我在参数中选择2000年3月作为默认值时,
我希望查询汇总:从1999年3月到2000年3月。

这是我到目前为止所得到的:

SELECT Name, SUM(sales) as totalsales, year_month
FROM Total_Sales
WHERE
(year_month = @year_month)
GROUP BY Name, year_month


谢谢你的帮助!

- 编辑 -

SELECT Name, SUM(sales) as totalsales, year_month
FROM Total_Sales
WHERE
(year_month >= @From) AND
(year_month <= @To)
GROUP BY Name, year_month


在“史蒂夫·摩根”的建议之后添加了此内容

我们是否可以以某种方式添加最近12个月的平均值,而无需在参数中选择12个月。
让“ @From”参数确定起始值。诸如此类:AVG(@-12个月起)?

再次感谢您的帮助!

-编辑2--

ROW_NUMBER()函数非常方便解决此问题。
我的查询现在看起来像这样:

SELECT  Name, SUM(sales)
FROM
(
SELECT  rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY year, year_month)
, Name
, sales = SUM(sales)
FROM     Total_Sales ts
WHERE
(year_month>= @From) AND
(year_month<= @To)
GROUP BY
Name
, year
, year_month
    ) ts
WHERE
rn <= 12

GROUP BY
Name

最佳答案

此代码比Steve Morgans长,但旨在使优化程序能够使用yearyear_month字段上的任何现有INDEX。仅当您具有相对较大的表时才有意义,因为该表旨在有效地知道可以跳过哪些记录。

(它也假定使用MS SQL Server,但该逻辑适用于其他RDBMS。)

DECLARE
  @DateParam AS DATETIME
SELECT
  @DateParam  = '2011 June 01'

;WITH MyTable (Name, Year, Year_Month, Sales) AS
(
             SELECT 'Rod', 2010, 1, 10
   UNION ALL SELECT 'Rod', 2010, 2, 10
   UNION ALL SELECT 'Rod', 2010, 3, 10
   UNION ALL SELECT 'Rod', 2010, 4, 10 UNION ALL SELECT 'Jane', 2010, 4, 10
   UNION ALL SELECT 'Rod', 2010, 5, 10 UNION ALL SELECT 'Jane', 2010, 5, 10
   UNION ALL SELECT 'Rod', 2010, 6, 10 UNION ALL SELECT 'Jane', 2010, 6, 10
------------------------------------------------------------------------------
   UNION ALL SELECT 'Rod', 2010, 7, 10 UNION ALL SELECT 'Jane', 2010, 7, 10
   UNION ALL SELECT 'Rod', 2010, 8, 10 UNION ALL SELECT 'Jane', 2010, 8, 10
   UNION ALL SELECT 'Rod', 2010, 9, 10 UNION ALL SELECT 'Jane', 2010, 9, 10
   UNION ALL SELECT 'Rod', 2010,10, 10 UNION ALL SELECT 'Jane', 2010,10, 10
                                       UNION ALL SELECT 'Jane', 2010,11, 10
                                       UNION ALL SELECT 'Jane', 2010,12, 10
                                       UNION ALL SELECT 'Jane', 2011, 1, 10
                                       UNION ALL SELECT 'Jane', 2011, 2, 10
   UNION ALL SELECT 'Rod', 2011, 3, 10 UNION ALL SELECT 'Jane', 2011, 3, 10
   UNION ALL SELECT 'Rod', 2011, 4, 10 UNION ALL SELECT 'Jane', 2011, 4, 10
   UNION ALL SELECT 'Rod', 2011, 5, 10
   UNION ALL SELECT 'Rod', 2011, 6, 10
------------------------------------------------------------------------------
   UNION ALL SELECT 'Rod', 2011, 7, 10
)

SELECT
  Name,
  Year,
  Year_Month,
  SUM(sales) AS Total_Sales
FROM
  MyTable
WHERE
   (Year = DATEPART(YEAR, @DateParam)     AND Year_Month <= DATEPART(MONTH, @DateParam))
OR (Year = DATEPART(YEAR, @DateParam) - 1 AND Year_Month >  DATEPART(MONTH, @DateParam))
GROUP BY
  Name,
  Year,
  Year_Month


笔记:
1.这将给出截至2011年6月(含)的12个月的结果
2.不包括2010年7月之前的数据
3. Rod的数据缺口不会导致Note 3被违反
4. Jane在2011年5月和2011年6月丢失的数据不会导致Note 3被违反
5. WHERE子句的表述将允许使用INDEX

关于sql - 如何使用参数求和最近12个月的总金额,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6910407/

10-12 18:33