使用group by计算总行数

时间:2009-07-16 22:28:19

标签: sql-server tsql

我有以下查询:

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

我希望它检索其上有4个ORDER_NUM的TRACKING_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_NUMs给我。但是,这在我的数据库上并不是非常高效(大约需要41秒)。我真正需要的是一个查询,它会给我一个计数,只有一个计数(并希望通过这样做更快)。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:13)

SELECT COUNT(*)
FROM (
   SELECT TRACKING_NUM
   FROM Orders
   GROUP BY TRACKING_NUM
   HAVING count(distinct ORDER_NUM) = 4) AS Agg

答案 1 :(得分: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)。

(听起来您的查询是针对某种报告的 - 如果是这种情况,并且如果它经常在性能受到影响的情况下运行,如您所建议的那样 - 您也可以获得所有值从一个查询,而不是更改或参数化您感兴趣的计数并重新运行它多次(即使这是自动化的。)让服务器为您做一次更好。请原谅我的假设,如果这是不是你正在努力的方向。)

我知道这并不是你所询问的...... Remus Rusanu已经指出了这一点,但你确实要求“任何建议”。