У меня есть следующий запрос:
select count(ords.TRACKING_NUM)
from Orders ords (NoLock)
group by ords.TRACKING_NUM
having count(distinct ords.ORDER_NUM) = 4
Я хочу, чтобы он извлек общее количество TRACKING_NUM, на которых есть 4 ORDER_NUM (должно быть 3352). Вместо этого я получаю 3352 строки, равные 4 (или больше из-за различий).
Я понимаю, почему это происходит. Он подсчитывает значения внутри каждой группы. И я могу легко изменить запрос на это:
select ords.TRACKING_NUM
from Orders ords (NoLock)
group by ords.TRACKING_NUM
having count(distinct ords.ORDER_NUM) = 4
а затем он возвращает мне 3352 строки TRACKING_NUM. Однако это не очень эффективно для моей базы данных (занимает около 41 секунды). Что мне действительно нужно, так это запрос, который даст мне счет и только счет (и, надеюсь, делая это быстрее).
Спасибо за любые предложения.
Ответ 1 · рейтинг 3 · DanO
SELECT OrderCount AS 'Total Orders', COUNT(TRACKING_NUM) AS 'Tracking Num Count'
FROM (
SELECT DISTINCT TRACKING_NUM, COUNT(DISTINCT ORDER_NUM) AS 'OrderCount'
FROM Orders
GROUP BY TRACKING_NUM
) AS tblOrdersPerTrackingNum
Это даст вам только подсчет для ваших TRACKING_NUM, как вы хотели, а также подсчет для любого другого количества общего количества заказов (а не только для количества заказов = 4).
(Похоже, что ваш запрос предназначен для какого-то отчета - если это так, и если он будет часто запускаться там, где производительность вызывает беспокойство, как вы предложили, - вы могли бы также получить все свои значения из одного запроса , вместо того, чтобы изменять или параметризовать количество, которое вас интересует, и повторно запускать его несколько раз (даже если это было автоматизировано). Гораздо лучше позволить серверу сделать все это за вас один раз. Простите мое предположение, если это не то, что вы стремились к этому.)
Я знаю, что это не совсем то, о чем вы спрашивали... Ремус Русану уже прибил это, но вы попросили "любые предложения".