Подсчитайте общее количество строк с группой по

У меня есть следующий запрос:

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 секунды). Что мне действительно нужно, так это запрос, который даст мне счет и только счет (и, надеюсь, делая это быстрее).

Спасибо за любые предложения.


person Vaccano    schedule 16.07.2009    source источник


Ответы (2)


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).

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

Я знаю, что это не совсем то, о чем вы спрашивали... Ремус Русану уже прибил это, но вы попросили «любые предложения».

person DanO    schedule 17.07.2009

person    schedule
comment
Выполнение этого в SSMS дает следующую ошибку: Сообщение 170, уровень 15, состояние 1, строка 7, строка 7: неправильный синтаксис рядом с ')'. - person Vaccano; 17.07.2009
comment
Если я запускаю его в ApexSQL Edit, я получаю эту ошибку: сообщение 156, уровень 15, состояние 1, произошло в строке: 10 Неверный синтаксис рядом с ключевым словом «набор». - person Vaccano; 17.07.2009
comment
Да, производным таблицам нужен псевдоним - person Remus Rusanu; 17.07.2009