0

我正在尝试获取销售人员列表以及他们在价值方面销售最多的月份。rank我有工作查询,但直到现在我才意识到,由于该站点使用 sql server 2000 ,我将无法使用该功能。

这是我当前的查询

select top 5 name, count(*) as amount
from
(
     select e.first_name + ' ' + e.last_name name,
     RIGHT(CONVERT(VARCHAR(10), oe.entry_date, 105), 7) as date, sum(oe.totalPrice) price,
            rank() over(partition by RIGHT(CONVERT(VARCHAR(10), oe.entry_date, 105), 7) 
                order by sum(oe.totalPrice) desc) as ranking
     FROM order_entry oe
     INNER JOIN employees e ON oe.sales_rep_emp_number = e.employee_number
     group by e.first_name + ' ' + e.last_name, RIGHT(CONVERT(VARCHAR(10), oe.entry_date, 105), 7)
) temp
where ranking = 1
group by name
order by count(*) desc

我需要用不依赖rank函数的东西替换那个内部查询。我找到了一些方法来“重现”这个函数的效果,但它们涉及制作一个带有标识列的临时表,用作排名表。但是,我有几个排名(每个月一个),所以这行不通。此外,我认为可能有另一种方法可以在没有该rank功能的情况下实现这一目标。

有人有想法么?谢谢!

4

1 回答 1

1

你需要回到首要原则。以下查询获取前 5 个员工编号:

select top 5 sales_rep_emp_number, COUNT(*) as numMonths
from (select yr, mon, MAX(TotalPrice) as maxTotalPrice
      from (select year(oe.entry_date) as yr, month(oe.entry_date) as mon, oe.sales_rep_emp_number,
                   SUM(totalPrice) as totalPrice
            from order_entry oe
            group by year(oe.entry_date), month(oe.entry_date), oe.sales_rep_emp_number
           ) yme
      group by yr, mon
     ) ym join
     (select year(oe.entry_date) as yr, month(oe.entry_date) as mon, oe.sales_rep_emp_number,
             SUM(totalPrice) as totalPrice
      from order_entry oe
      group by year(oe.entry_date), month(oe.entry_date), oe.sales_rep_emp_number
     ) yme
     on ym.yr = yme.yr and
        ym.mon = yme.mon and
        ym.maxTotalPrice = ye.totalPrice
group by sales_rep_emp_number
order by 2 desc

这与 - 具有相同的“缺陷” rank()- 如果多个员工具有相同的销售额,则可以在给定月份计为最高。

我已经离开了您加入其他员工信息的部分。

于 2013-01-07T23:18:22.163 回答