我想对 SQL 查询中最近 12 个月的值进行求和。
问题是总结过去 12 个月,而不是只计算全年。
因此,当我在参数中选择 2000 年 3 月作为默认值时,
我希望对查询进行 SUM:从 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
根据“Steve Morgan”的建议添加了此内容
我们是否可以在不选择参数中的 12 个月的情况下以某种方式添加过去 12 个月的平均值?
让“@From”参数决定起始值。类似于:AVG(@From -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 长,但旨在允许优化器能够使用 year
和 year_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数据的差距不会导致注释3被违反
4. Jane在2011年5月和2011年6月的缺失数据不会导致注释3被破坏
5. WHERE 子句的表述将允许使用 INDEX
关于sql - 如何使用参数求出过去 12 个月的总金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6910407/