如何将查询结果进行排名
前端时间在做一个售票员销售业绩排行的时候,写出来了,后来领导说加上名次上去好看些
于是乎我就开始写,嘿,奇怪,我还真没有写过,于是找了写资料,借鉴了一下别人的,结果如下
CREATE PROCEDURE csp_GetOperatorScoreByDate
@BeginDate DATETIME,@EndDate DATETIME
AS
CREATE TABLE #Temp //定义临时表,三个显示字段
(
Employee varchar(50),//销售人员的名字
TotalTicket int,//总票数
TotalTradeSum money//总销售额
)
INSERT INTO #Temp
SELECT A.RealName AS Employee,
TotalTicket=(SELECT COUNT(*) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0
AND DATEDIFF(DD,OrderTime,@EndDate)>=0 AND Operator_Id1=A.Id AND State<>4),
CASE WHEN (SELECT SUM(Price) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0
AND DATEDIFF(DD,OrderTime,@EndDate )>=0 AND Operator_Id1=A.Id AND State<>4) IS NULL THEN 0
ELSE (SELECT SUM(Price) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0 AND DATEDIFF(DD,OrderTime,@EndDate)>=0
AND Operator_Id1=A.Id AND State<>4) END AS TotalTradeSum FROM Operators A
WHERE A.Kind=1 OR A.Kind=3 GROUP BY A.RealName,A.ID ORDER BY TotalTicket DESC
//这段代码呢 有点长,也有点意思,不必去看怎么得到的字段,但是里面还是有些东西可以值得一看所以也就贴出来了,现在写存储过程没有注意过效率,慢慢来。
//一下就是实现名次了,之所以使用临时表,就是为了将需要的字段放到一个临时表中,便于简单操作
SELECT Employee,TotalTicket,TotalTradeSum,
(SELECT COUNT(*)+1 AS [Order] FROM #Temp B WHERE B.TotalTicket > A.TotalTicket) AS [Order] FROM #Temp A
ORDER BY TotalTicket DESC
好 关键的句子来了,SELECT COUNT(*)+1 AS [Order] FROM #Temp B WHERE B.TotalTicket > A.TotalTicket,这句语句我曾经开始的时候也不是很懂,就是我们群里开始问,结果很多人还是解释不清楚,结果另一个群的一个人给我说喊我考虑成循环来理解,我就想了想,原来是将同一个表考虑成两个表将字段的值来进行一次比较,并对符合条件的结果查询出来——COUNT(*)+1,此处的加1是为了避免第一名的序号为零。
好,完了
CREATE PROCEDURE csp_GetOperatorScoreByDate
@BeginDate DATETIME,@EndDate DATETIME
AS
CREATE TABLE #Temp //定义临时表,三个显示字段
(
Employee varchar(50),//销售人员的名字
TotalTicket int,//总票数
TotalTradeSum money//总销售额
)
INSERT INTO #Temp
SELECT A.RealName AS Employee,
TotalTicket=(SELECT COUNT(*) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0
AND DATEDIFF(DD,OrderTime,@EndDate)>=0 AND Operator_Id1=A.Id AND State<>4),
CASE WHEN (SELECT SUM(Price) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0
AND DATEDIFF(DD,OrderTime,@EndDate )>=0 AND Operator_Id1=A.Id AND State<>4) IS NULL THEN 0
ELSE (SELECT SUM(Price) FROM Tickets WHERE DATEDIFF(DD,@BeginDate,OrderTime)>=0 AND DATEDIFF(DD,OrderTime,@EndDate)>=0
AND Operator_Id1=A.Id AND State<>4) END AS TotalTradeSum FROM Operators A
WHERE A.Kind=1 OR A.Kind=3 GROUP BY A.RealName,A.ID ORDER BY TotalTicket DESC
//这段代码呢 有点长,也有点意思,不必去看怎么得到的字段,但是里面还是有些东西可以值得一看所以也就贴出来了,现在写存储过程没有注意过效率,慢慢来。
//一下就是实现名次了,之所以使用临时表,就是为了将需要的字段放到一个临时表中,便于简单操作
SELECT Employee,TotalTicket,TotalTradeSum,
(SELECT COUNT(*)+1 AS [Order] FROM #Temp B WHERE B.TotalTicket > A.TotalTicket) AS [Order] FROM #Temp A
ORDER BY TotalTicket DESC
好 关键的句子来了,SELECT COUNT(*)+1 AS [Order] FROM #Temp B WHERE B.TotalTicket > A.TotalTicket,这句语句我曾经开始的时候也不是很懂,就是我们群里开始问,结果很多人还是解释不清楚,结果另一个群的一个人给我说喊我考虑成循环来理解,我就想了想,原来是将同一个表考虑成两个表将字段的值来进行一次比较,并对符合条件的结果查询出来——COUNT(*)+1,此处的加1是为了避免第一名的序号为零。
好,完了