SQL TOP 1 возвращает ноль при использовании в подзапросе - PullRequest
0 голосов
/ 04 июня 2018

Пожалуйста, не могли бы вы помочь с этим подзапросом - он работает нормально, я запускаю его сам для одного клиента, но при добавлении к запросу возвращает ноль.

Для каждого клиента мне нужно, чтобы сотрудник имел наибольшее количествоorders.

Это часть гораздо большего запроса, поэтому производительность также является проблемой.

SELECT c.ClientId, s.BestEmployeeId 
FROM client c
LEFT OUTER JOIN(
SELECT TOP 1 o.EmployeeId AS BestEmployeeId, count(o.EmployeeId) AS cnt, o.ClientId
    FROM Orders o
    WHERE o.EmployeeId > 0
    AND o.EmployeeId is not null    
    GROUP BY o.ClientId, o.EmployeeId
    ORDER BY cnt DESC
) AS s on c.ClientId = s.ClientId

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете использовать apply для этого

SELECT c.ClientId, b.BestEmployeeId 
FROM client c OUTER APPLY (
       SELECT TOP 1 o.EmployeeId AS BestEmployeeId
       FROM Orders o
       WHERE o.ClientId = c.ClientId AND o.EmployeeId > 0
       GROUP BY o.EmployeeId
       ORDER BY count(o.EmployeeId) DESC
   ) b;
0 голосов
/ 04 июня 2018

Для каждого клиента мне нужно получить сотрудника с наибольшим количеством заказов.

Я бы сделал это с помощью функций агрегирования и окна:

select oc.*
from (select o.client, o.employeeid, count(*) as cnt,
             rank() over (partition by o.client order by count(*) desc) as seqnum
      from Orders o
      group by o.client, o.employeeid
     ) oc
where seqnum = 1;

Обратите внимание, чтовам, похоже, не нужна таблица client, потому что orders, похоже, содержит и client, и employeeid.

Ваша версия отфильтровывает NULL значения employeeid.Вы также можете сделать это в подзапросе (хотя в вашем заявлении о проблеме ничего не говорится о таких значениях).

...