2010-09-22 42 views
9

Bạn có thể sử dụng COUNT trong truy vấn có mệnh đề HAVING để COUNT trả về số hàng không? Khi tôi thử, tôi nhận được số lần số ID hiển thị trong bảng. Dưới đây là các truy vấn:COUNT kết quả từ Truy vấn SQL với mệnh đề HAVING

SELECT col_appid, min(col_payment_issued_date) as PayDate 
FROM tbl_ui_paymentstubs 
WHERE isnull(col_payment_amount,0) > 0 
GROUP BY col_appid 
HAVING min(col_payment_issued_date) >= '09/01/2010' and min(col_payment_issued_date) <= '09/30/2010' 

tôi nhận được trở lại 6 dòng, đó là tốt, nhưng tôi muốn chỉ lấy lại số 6.

tôi thấy tôi có thể làm theo cách này, nhưng tự hỏi nếu có một người khác, cách thanh lịch hơn:

WITH Claims_CTE(AppID, PayDate) as 
( 
SELECT col_appid, min(col_payment_issued_date) as PayDate 
FROM tbl_ui_paymentstubs 
WHERE isnull(col_payment_amount,0) > 0 
GROUP BY col_appid 
HAVING min(col_payment_issued_date) >= '09/01/2010' and min(col_payment_issued_date) <= '09/30/2010' 
) 
SELECT count(AppID) as Amount from Claims_CTE 

'

+0

Bạn có thể đăng bài về cấu trúc bảng của mình không? Tôi bị nhầm lẫn về lý do tại sao bạn đang sử dụng tối thiểu trong truy vấn này ... – armonge

+0

Tôi phải tìm khoản thanh toán sớm nhất cho mỗi khiếu nại (AppID) và nếu khoản thanh toán đó là lần đầu tiên cho yêu cầu đó và rơi vào tháng hiện tại, hãy tính. –

Trả lời

11

Sử dụng COUNT với một điều khoản GROUP BY sẽ cung cấp một số lượng cho mỗi nhóm. Nếu bạn muốn đếm số lượng nhóm, nó sẽ phải là một truy vấn riêng biệt (như ví dụ CTE của bạn).

tôi sẽ chỉ sử dụng một subquery đơn giản, thay vì CTE:

SELECT COUNT(*) FROM 
(SELECT col_appid, min(col_payment_issued_date) as PayDate 
    FROM tbl_ui_paymentstubs 
    WHERE isnull(col_payment_amount,0) > 0 
    GROUP BY col_appid 
    HAVING 
    min(col_payment_issued_date) >= '09/01/2010' 
    and min(col_payment_issued_date) <= '09/30/2010') Claims 
+0

Ví dụ này là, ném một lỗi không may. Tôi biết bạn đang ở đâu, nhưng 'ar' có một giải pháp "làm việc". Vì vậy, tôi sẽ phải đưa điểm cho cá nhân đó. Tôi đánh giá cao sự giúp đỡ mặc dù! –

+0

Đã sửa lỗi. Rõ ràng bạn không thể chọn từ truy vấn phụ mà không đặt tên truy vấn phụ. (Và bạn không thể sử dụng truy vấn phụ trong câu lệnh 'WHERE ... IN' _with_ a name) – bdukes

+0

Ok tôi đã đưa nó cho bạn, như tôi nhận thấy sau khi Emtucifor đưa ra vấn đề DateTime và BETWEEN, áp phích khác đang sử dụng GIỮA . Mặc dù điều này có thể hoạt động với kiểu dữ liệu DATE mới hơn, nhưng cũng cần xem xét phần thời gian. –

4

Bạn cũng có thể sử dụng một subquery.

SELECT count(*) as Amount 
FROM (
    SELECT col_appid FROM tbl_ui_paymentstubs 
    WHERE isnull(col_payment_amount,0) > 0 
    GROUP BY col_appid 
    HAVING min(col_payment_issued_date) BETWEEN '09/01/2010' AND '09/30/2010' 
) Claims 
2

Giả sử bạn có một bảng với các danh sách khác nhau của các giá trị col_appid gọi App, truy vấn này cũng làm việc và có thể được hiệu suất tốt hơn, quá:

SELECT Count(*) 
FROM 
    App A 
    CROSS APPLY (
     SELECT TOP 1 col_payment_issued_date 
     FROM tbl_ui_paymentstubs P 
     WHERE 
     P.col_payment_amount > 0 
     AND A.col_appid = P.col_appid 
     ORDER BY col_payment_issued_date 
    ) X 
WHERE 
    X.col_payment_issued_date >= '09/01/2010' 
    AND X.col_payment_issued_date < '10/01/2010' 

Nếu không có bảng App, bạn có thể thay thế (SELECT DISTINCT col_appid FROM tbl_ui_paymentstubs) A nhưng điều đó cũng sẽ không hoạt động. Nó vẫn có thể là một ứng cử viên so với các truy vấn khác được đưa ra.

ghi chú khác:

  • Bạn không cần phải làm isnull(column, 0) > 0column > 0 đã không bao gồm NULLs.

  • @ ar và truy vấn @bdukes' không cần bất cứ điều gì trong mệnh đề SELECT bên trong, họ chỉ có thể chọn 1 trong đó có thể là một cải tiến hiệu suất (không có gì thay đổi khác)

  • Tôi hy vọng có một hạn chế vào col_payment_issued_date để các giá trị không có phần thời gian như 11:23 AM, nếu không mệnh đề BETWEEN của bạn cuối cùng sẽ không kéo dữ liệu chính xác cho cả tháng.

Cập nhật

  • Đối với những gì nó có giá trị, định dạng ngày '20.100.901' sẽ làm việc ở khắp mọi nơi, với bất kỳ ngôn ngữ hoặc cài đặt DATEFIRST. Tôi khuyến khích bạn có thói quen sử dụng nó. Các định dạng khác như '09/01/2010 'hoặc' 2010/09/01 'và như vậy có thể nhận được tháng và ngày trộn lẫn.

@DScott nói:

Có một tbl_Application, nhưng trong trường hợp này không được sử dụng. Tôi có thể tham gia vào nó, nhưng tôi chỉ tính các khoản thanh toán cho truy vấn này vì vậy nó không bắt buộc.

Bạn có muốn thử truy vấn của mình và cho tôi phản hồi về hiệu suất của nó so với các phương pháp khác không? Tôi hy vọng rằng ngay cả với việc tham gia thêm vào truy vấn, nó thực hiện khá tốt.

+0

Cảm ơn thông tin. Bạn nói đúng về vấn đề GIỮA GIỮA, tôi không chú ý hơn trong giải pháp ban đầu mà tôi đã chọn. Bây giờ tấm áp phích khác đã sửa lại câu trả lời của họ, tôi đã chọn cái đó. Có một tbl_Application, nhưng trong trường hợp này không được sử dụng. Tôi * có thể * tham gia vào nó, nhưng tôi chỉ tính các khoản thanh toán cho truy vấn này, vì vậy nó không bắt buộc. –

+0

phản hồi tuyệt vời, toàn diện, @Emtucifor – bdukes

+0

@bdukes Cảm ơn! – ErikE

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