如何将查询结果进行排名
前端时间在做一个售票员销售业绩排行的时候,写出来了,后来领导说加上名次上去好看些
于是乎我就开始写,嘿,奇怪,我还真没有写过,于是找了写资料,借鉴了一下别人的,结果如下
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是为了避免第一名的序号为零。
好,完了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!