1

各顧客のランクを選択し、出力に他の情報とともに表示するために、次のクエリを作成しました。

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()しかし、関数を使用せずにランキングの仕事をする方法を知りたいです。出来ますか?

4

3 に答える 3

3

はい、現在の行の並べ替え列の値よりも小さい (並べ替え列) の値を持つ行の数を数えるだけです...

   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 
于 2010-09-08T12:03:46.260 に答える
0

使用しdense_rankないと、基本的に実行中の合計問題のバージョンがあります。

これは、効率的な方法で SQL で行うのが難しいことです。チャールズの答えのように三角結合を使用できます。ただし、数百を超えるレコードがある場合、これはカーソルによって実行されることがわかります。

なぜあなたは使いたくないのですdense_rankか?

于 2010-09-08T12:24:08.727 に答える