我使用过这个公式。
引用更改=(当前月份数据/上个月数据)* 100
然后我存储在SQL SERVER表上的数据如下所示:
id DATE DATA
1 2015/01/01 10
2 2015/02/01 20
3 2015/03/01 30
4 2015/04/01 40
5 2015/05/01 50
6 2015/06/01 60
7 2015/07/01 70
8 2015/08/01 80
9 2015/09/01 90
如何在SQL函数上实现此公式?
例如
current month is 2015/02/1
Quote change = (Current Month Data / Previous Month Data ) * 100
Quote change =( 15/10)*100
然后,如果当前日期是2015/01/01。因为在2015/01/01之前没有数据,我需要显示0或#
答案 0 :(得分:2)
Sql server 2012有一个名为LAG
的窗口函数,在这种情况下非常有用
Lag
返回上一行中特定列的值(由order by
子句的over
部分指定。)
试试这个:
;With cte as
(
SELECT Id, Date, Data, LAG(Data) OVER(ORDER BY Date) As LastMonthData
FROM YourTable
)
SELECT Id,
Date,
Data,
CASE WHEN ISNULL(LastMonthData, 0) = 0 THEN 0 ELSE (Data/LastMonthData) * 100 END As Quote
FROM cte
我已经使用了CTE
,所以我不必重复LAG
两次。
CASE
表达式用于防止在LastMonthData为0或null的情况下发生异常。
答案 1 :(得分:0)
您可以使用如下所述的内部联接 -
select a.*,isnull(cast(a.data/b.data as decimal(4,2))*100,0)
from TableA as a
inner join TableA as b
on b.date = dateadd(mm,-1,a.date)
如果有帮助,请告诉我