Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 计算差额和百分比_Sql Server 2008 - Fatal编程技术网

Sql server 2008 计算差额和百分比

Sql server 2008 计算差额和百分比,sql-server-2008,Sql Server 2008,我有以下数据,即某一特定职位的招聘/申请人数,并想找出上一年和本年之间的差异及其增加或减少的百分比 提到了预期输出中括号内使用的公式 Office year recruited applied Pune 2015 10 15 Pune 2016 7 20 Mumbai 2015 10 23

我有以下数据,即某一特定职位的招聘/申请人数,并想找出上一年和本年之间的差异及其增加或减少的百分比

提到了预期输出中括号内使用的公式

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%

请提供帮助。

如果您使用的是SQL Server 2012或更高版本,则可以使用滞后(或超前)功能。既然你不是,你可以通过CTE获得创造力。这一方法来自于

希望这有帮助

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