Подсчитать общее количество строк в группе по - PullRequest
5 голосов
/ 17 июля 2009

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

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

Я понимаю, почему это происходит. Он считает значения внутри каждой группы по. И я могу легко изменить запрос на это:

select  ords.TRACKING_NUM
from    Orders ords (NoLock)   
group by ords.TRACKING_NUM
having count(distinct ords.ORDER_NUM) = 4

и затем мне возвращается 3 352 строки TRACKING_NUM. Тем не менее, это не очень эффективно в моей базе данных (занимает около 41 секунды). Что мне действительно нужно, так это запрос, который даст мне счетчик и только счетчик (и, надеюсь, будет быстрее).

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

Ответы [ 2 ]

13 голосов
/ 17 июля 2009
SELECT COUNT(*)
FROM (
   SELECT TRACKING_NUM
   FROM Orders
   GROUP BY TRACKING_NUM
   HAVING count(distinct ORDER_NUM) = 4) AS Agg
2 голосов
/ 17 июля 2009
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).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...