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ます。この関数の効果を「再現」する方法をいくつか見つけましたが、ランク テーブルとして使用される ID 列を含む一時テーブルを作成する必要がありました。しかし、私はいくつかのランキング (毎月 1 つ) を持っているので、うまくいきません。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 に答える