sql - 如何使用参数求出过去 12 个月的总金额

标签 sql parameters sum

我想对 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 长,但旨在允许优化器能够使用 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数据的差距不会导致注释3被违反
4. Jane在2011年5月和2011年6月的缺失数据不会导致注释3被破坏
5. WHERE 子句的表述将允许使用 INDEX

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

相关文章:

sql - 按多列分组并将结果作为单独列中的数组

r - 在R中获取总和为274且最大值为4的所有组合

c# - 使用 C# sql 对表的特定列的行进行求和

php - Codeigniter 防止将参数传递给函数以避免不存在的 URI 段

php - 基本参数题

MySQL 减去两个相似的行并将结果乘以另一行

c# - 如何将数据随机绑定(bind)到单选按钮列表 asp.net

mysql - 当解释看起来不错时如何改善查询时间?

sql - 一对一关系的数据库设计

c# - 从 OleDbCommand 返回值