问一个关于rank排序的问题
薪资表T(id,date,salary)
我用rank()给7月份的薪资排序,再给8月份的薪资排序,然后我想知道这2个月里排序变动最大的前5名,
降低幅度最大的前5名,升高幅度最大的前5名。
[解决办法]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testtb](
[fEmployee] [nvarchar](50) NULL,
[fSalery] [numeric](18, 2) NULL,
[fDate] [date] NULL
) ON [PRIMARY]
GO
INSERT INTO testtb
SELECT '张三',12452,GETDATE()
UNION
SELECT '历史',5262,GETDATE()
UNION
SELECT '咖啡机',23511,GETDATE()
UNION
SELECT '大锅饭',5231,GETDATE()
UNION
SELECT '张三',63263,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '历史',2363,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '咖啡机',1552,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '大锅饭',43733,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '说的',26363,GETDATE()
UNION
SELECT '第三方',562,GETDATE()
UNION
SELECT '阿什顿',211,GETDATE()
UNION
SELECT '单身档',5131,GETDATE()
UNION
SELECT '说的',263,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '第三方',23163,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '阿什顿',15652,DATEADD(MONTH,-1,GETDATE())
UNION
SELECT '单身档',433,DATEADD(MONTH,-1,GETDATE())
SELECT TOP 5 a.fEmployee,
SUM(CASE a.fDate WHEN CONVERT(DATE,DATEADD(MONTH,-1,GETDATE()))
then a.fSalery ELSE 0 END)
八月薪水,
SUM(CASE a.fDate WHEN CONVERT(DATE,GETDATE())
then a.fSalery ELSE 0 END)
九月薪水
,SUM(CASE a.fDate WHEN CONVERT(DATE,DATEADD(MONTH,-1,GETDATE()))
then a.排名 ELSE 0 END) 八月排名,
SUM(CASE a.fDate WHEN CONVERT(DATE,GETDATE())
then a.排名 ELSE 0 END) 九月排名,
SUM(CASE a.fDate WHEN CONVERT(DATE,DATEADD(MONTH,-1,GETDATE()))
then a.排名 ELSE 0 END)-SUM(CASE a.fDate WHEN CONVERT(DATE,GETDATE())
then a.排名 ELSE 0 END) 排名变动
FROM
(
SELECT a.fEmployee,a.fDate,a.fSalery
,rank() over(partition by a.fDate order by a.fSalery desc) 排名
FROM testtb a
) a
GROUP BY a.fEmployee
ORDER BY SUM(CASE a.fDate WHEN CONVERT(DATE,DATEADD(MONTH,-1,GETDATE()))
then a.排名 ELSE 0 END)-SUM(CASE a.fDate WHEN CONVERT(DATE,GETDATE())
then a.排名 ELSE 0 END) DESC