我有以下查询:
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秒)。我真正需要的是一个查询,它会给我一个计数,只有一个计数(并希望通过这样做更快)。
感谢您的任何建议。
答案 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已经指出了这一点,但你确实要求“任何建议”。