如何划分不同行

时间:2016-03-28 09:46:53

标签: sql sql-server function

我使用过这个公式。

引用更改=(当前月份数据/上个月数据)* 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或#

2 个答案:

答案 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)

如果有帮助,请告诉我