2009-07-16 45 views
5

Tôi có truy vấn sau đây:Đếm tổng số hàng với một nhóm bởi

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

Tôi muốn nó lấy tổng số tiền TRACKING_NUMs có 4 ORDER_NUMs trên chúng (nên 3352). Thay vào đó, tôi nhận được 3.352 hàng bằng 4 (hoặc nhiều hơn vì khác biệt).

Tôi hiểu tại sao điều này xảy ra. Nó đang đếm các giá trị bên trong mỗi nhóm. Và tôi có thể dễ dàng thay đổi truy vấn này:

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

và sau đó nhận được 3.352 hàng TRACKING_NUMs trả lại cho tôi. Tuy nhiên, điều này không phải là rất thực hiện trên cơ sở dữ liệu của tôi (mất khoảng 41 giây). Những gì tôi thực sự cần là một truy vấn mà sẽ cho tôi một số và chỉ đếm (và bằng cách đó hy vọng đi nhanh hơn).

Cảm ơn mọi đề xuất.

Trả lời

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

Chạy điều này trong SSMS cung cấp lỗi sau: Msg 170, Cấp 15, Tiểu bang 1, Dòng 7 Dòng 7: Cú pháp không chính xác gần ')'. – Vaccano

+0

Nếu tôi chạy nó trong ApexSQL sửa Tôi nhận được lỗi này: Msg 156, Cấp 15, Tiểu bang 1, Xảy ra trên Đường dây: 10 Cú pháp không đúng gần từ khoá 'bộ'. – Vaccano

+0

Có, bảng dẫn xuất cần có bí danh –

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 

Điều này sẽ giúp bạn có được chỉ là tính cho TRACKING_NUMs của bạn như bạn muốn, và cũng nhận được tính cho mỗi số tiền khác trong tổng số đơn đặt hàng (không chỉ có số thứ tự = 4).

(Có vẻ như truy vấn của bạn dành cho một số loại báo cáo - và nếu điều đó xảy ra thường xuyên, nơi hiệu suất là mối quan tâm, như bạn đã đề xuất - bạn cũng có thể nhận tất cả các giá trị từ một truy vấn, thay vì thay đổi hoặc tham số hóa số đếm mà bạn quan tâm và chạy lại nó nhiều lần (ngay cả khi đã được tự động) .Tốt hơn để cho máy chủ thực hiện tất cả cho bạn một lần. không phải là những gì bạn đang làm việc theo hướng.)

Tôi biết đó không chính xác những gì bạn đang hỏi về ... Remus Rusanu đã đóng đinh đó, nhưng bạn đã yêu cầu "bất kỳ đề xuất".

Các vấn đề liên quan