SQL Server:比较同一表中的数据

时间:2015-09-30 20:21:15

标签: sql sql-server select count sum

我的数据库是SQL Server 2012 SP1。

这是我的表:

  DATE            F1          F2        F3
2015-07-1         32           5        78
2015-08-20        18          45        67
2015-09-1         64           9        80
2015-09-30        12          78        45

现在我想计算总和并仅选择上个月和当前月份之间的差值,因此在此示例中,所选数据应该在8月到9月之间,因此例如对于字段F1,它将需要8月的唯一值为18,然后是9月64 + 12 = 76的两个值,然后计算差值76-18,因此F1的值应为58。

提前致谢。

2 个答案:

答案 0 :(得分:0)

Select


    sum(case when Month(date) = month(curdatde()) and  Year(date) = Year(curdatde()) then F1 else null end)- sum(case when Month(date) = (month(curdatde())-1) and  Year(date) = Year(curdatde()) then F1 else null end) as'F1',
     sum(case when Month(date) = month(curdatde()) and  Year(date) = Year(curdatde()) then F2 else null end)- sum(case when Month(date) = (month(curdatde())-1) and  Year(date) = Year(curdatde()) then F2 else null end) as'F2', 
    sum(case when Month(date) = month(curdatde()) and  Year(date) = Year(curdatde()) then F3 else null end)- sum(case when Month(date) = (month(curdatde())-1) and  Year(date) = Year(curdatde()) then F3 else null end) as'F3' from your table

这适用于mySql

答案 1 :(得分:0)

这可能是过度设计的,但我认为它可以满足您的需求。我打电话给你的桌子" example_data"。第一个CTE(summed_data)按月对数据进行分组,并汇总F列。第二个CTE然后命令它全部并且仅花费最近的两个月(所以这确实假设您没有未来的数据)。它使用ROW_NUMBER()将1分配给当前月份,将2分配给上个月。然后在最后的SELECT中,它将第二个CTE的结果连接起来。使用行标识符来标识当前和前几个月,然后获取每列的差异。

WITH summed_data (some_date, f1, f2, f3)
AS
(
  SELECT MAX(some_date), SUM(f1), SUM(f2), SUM(f3)
    FROM example_data
  GROUP BY MONTH(some_date), YEAR(some_date)
),
last_two_months (row_number, f1, f2, f3)
AS 
(
  SELECT TOP 2 ROW_NUMBER() OVER(ORDER BY some_date DESC), f1, f2, f3 
    FROM summed_data
  ORDER BY some_date DESC
)

SELECT CURRENT_MONTH.f1 - PRIOR_MONTH.f1, 
       CURRENT_MONTH.f2 - PRIOR_MONTH.f2, 
       CURRENT_MONTH.f3 - PRIOR_MONTH.f3
  FROM last_two_months CURRENT_MONTH, last_two_months PRIOR_MONTH
 WHERE CURRENT_MONTH.row_number = 1
   AND PRIOR_MONTH.row_number = 2