2016-08-24 145 views
0

我还是SQL Server的新手,我需要帮助解决这个问题。SQL Server查找行之间的差异

我需要制作一个像这样的输出:

PNRFNAME | PNRFNAME | Salary_Difference 
---------+----------+------------------ 
Jason | Vicki |  483778.43 
Jason | Tiff  | -34540999.72 
Vicki | Tiff  | -35024778.15 

,我目前已经充满了这个数据表:

PresenterID | PnrLName   | PnrFName | age | years | Salary_Yearly 
------------+------------------+----------+-----+-------+-------------- 
EMP_01  | NEEDELL   | Tiff  | 61 | 10 | 37451000.70 
EMP_02  | BUTLER-HENDERSON | Vicki | 41 | 10 | 2426222.55 
EMP_03  | PLATO   | Jason | 45 | 8 | 2910000.98 

的代码,我到目前为止有:

SELECT 
    a.Pnr_FName, b.Pnr_FName, 
    CONCAT((a.Salary_Yearly - b.Salary_Yearly), (a.Salary_Yearly - a.Salary_Yearly)) AS Salary_Difference 
FROM 
    PRESENTERS b 
CROSS JOIN 
    PRESENTERS a 

希望这是有道理的!我试图让我的问题明确

+0

如果您想要将值与前一行或后一行进行比较,则需要研究LEAD和LAG如果您有SQL 2012 – scsimon

+0

[SQL Server的可能重复:比较同一表中的人员薪水并显示两个名称](http://stackoverflow.com/questions/39129803/sql-server-compare-salary-of-people-in-the-same-table-and-display-both-names) –

回答

0

试试这个:

CREATE TABLE #PRESENTERS(PRESENTERID VARCHAR(20), PNRLNAME VARCHAR(25), PNRFNAME VARCHAR(25), AGE INT, YEAR INT , SALARY_YEARLY NUMERIC(11,2)) 

INSERT INTO #PRESENTERS 

SELECT 'EMP_01','NEEDELL','TIFF',61,10,37451000.7   UNION ALL 
SELECT 'EMP_02','BUTLER-HENDERSON','VICKI',41,10,2426222.55 UNION ALL 
SELECT 'EMP_03','PLATO','JASON',45,8,2910000.98 

;WITH A 
AS 
(
SELECT ROW_NUMBER() OVER (ORDER BY PRESENTERID DESC) RN, * 
FROM #PRESENTERS 
) 
SELECT A.PNRFNAME , A2.PNRFNAME, A.SALARY_YEARLY - A2.SALARY_YEARLY SALARY_DIFF 
FROM A 
INNER JOIN A A2 ON A.RN < A2.RN 
0

您可以使用超前或滞后于得到这样的:使用下面的查询,

;with cte as (
select pnrfname, Salary_yearly, lag(salary_yearly) over (order by presenterid) lag_sal, 
lag(pnrfname) over (order by presenterid) as lag_fname from #PRESENTERS 
) select pnrfname, lag_fname, salary_yearly-lag_sal from cte 

这是解决你的要求吗?