2016-11-17 13 views
-1

以下のデータ、特定のオフィスに採用された/採用された番号があり、過去と現在の年の間の差異とそれらのパーセントの増減を見たいと思います。差とパーセントの計算

予想される出力で角括弧内に使用する式を示しました。

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% 

答えて

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 

これが役に立ちます。