计算差异和百分比

时间:2016-11-17 13:59:48

标签: sql-server-2008

我有以下数据,为特定办公室招募/申请的数字,并希望找到上一年和当前年份之间的差异及其增加或减少的百分比。

提到在预期输出中使用括号中的公式。

Office      year        recruited       applied
Pune        2015            10            15
Pune        2016            7             20
Mumbai      2015            10            23
Mumbai      2016            15            18

我的预期输出应该是:

Office      Difference      %recruited
Pune        -3  (7-10)      -30%(7-10/10)
Mumbai      5(15-10)         50%

请帮忙。

1 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2012或更高版本,则可以使用LAG(或LEAD)功能。既然你不是,你可以通过CTE获得创意。这种方法取自http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/

SELECT 'Pune' AS Office,
'2015' AS year,
10 AS recruited,
15 AS applied
INTO #Temp
UNION 
SELECT 'Pune' AS Office,
'2016' AS year,
7 AS recruited,
20 AS applied
UNION 
SELECT 'Mumbai' AS Office,
'2015' AS year,
10 AS recruited,
23 AS applied
UNION 
SELECT 'Mumbai' AS Office,
'2016' AS year,
15 AS recruited,
18 AS applied;

WITH cte AS (
SELECT rownum = ROW_NUMBER() OVER (PARTITION BY t.office ORDER BY t.year), * FROM #Temp t)
SELECT cte.office, cte.recruited - prv.recruited AS DifferenceRecruited,
((cte.recruited - prv.recruited) / CONVERT(FLOAT, prv.recruited) * 100) AS RecruitedChangePercentage,
cte.applied - prv.applied AS DifferenceApplied,
((cte.applied - prv.applied) / CONVERT(FLOAT, prv.applied) * 100) AS AppliedChangePercentage
  FROM cte
LEFT JOIN cte prv ON prv.Office = cte.office AND prv.rownum = cte.rownum - 1
WHERE prv.recruited IS NOT null
ORDER BY cte.Office DESC

希望这有帮助。