我的数据库是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。
提前致谢。
答案 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