[英]SQL Server : compare data in same table
我的數據庫是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。
提前致謝。
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
這可能是過度設計的,但是我認為它可以滿足您的需求。 我稱您的表為“ 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.