我已经编写了以下查询,以便选择每个客户的等级并将其与其他信息一起显示在输出中。
use northwind
go
select
Employees.EmployeeID as ID,
FirstName+' '+LastName as Name,
DENSE_RANK() over (order by SUM(Orders.OrderID)) as [Rank]
from
employees
inner join
orders
on
Employees.EmployeeID = Orders.EmployeeID
group by
Employees.EmployeeID,
FirstName+' '+LastName
但是我想知道如何在不使用DENSE_RANK()
功能的情况下进行排名工作。可能吗?
是,只需计算(排序列)值小于当前行排序列值的行数...
Select *,
(Select Count(*) From Table
Where SortColumn <= t.SortColumn) as Rank
From table t
注意:如果您不想计算重复项,则排序列应该是唯一的。例如,如果您想对测试分数进行排名,那么该技术将为具有相同分数的每个人提供相同的排名,而不是将他们随机分配给所有不同的排名。
在您的示例中,
Select e.EmployeeID as ID,
FirstName+' '+LastName as Name,
(Select Count(*) From Employees
Where EmployeeID <= e.EmployeeId)
From employees e
Join Orders o
On e.EmployeeID = o.EmployeeID
Group by e.EmployeeID, FirstName+' '+LastName
没有使用dense_rank
,您基本上有了运行总计问题的版本。
这在SQL中很难以有效的方式完成。您可以使用三角形连接,如Charles的答案。如果您有几百条记录,那么您会发现这是由游标执行的。
您为什么不想使用dense_rank
?
没有排名功能的排名销售员的脚本
选择salesperson_id,amt,(从中选择count(*)+1(选择总和(sales_amount)为Amt从销售组按salesperson_id顺序按sum(sales_amount)desc)其中A.amt