2010-02-03 37 views
7

Tôi đang thiết kế một truy vấn trong SSMS 2005 mà trông giống như sau:Chọn Count (Value biệt) trả về 1

SELECT COUNT(DISTINCT ColumnName) FROM Table WHERE ColumnName IS NOT NULL 

Khi tôi chạy truy vấn với COUNT() nó trả về giá trị 1. Khi tôi chạy nó mà không có COUNT(), SSMS báo cáo giá trị chính xác, ví dụ: 212 bản ghi.

Cột được đề cập là số dữ liệu (16, 0).

Đối với những người có thể hỏi, truy vấn đầy đủ là:

SELECT COUNT(DISTINCT O_ID) FROM vEmployers 
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND E_START < '01-AUG-2009' 
AND O_ID IS NOT NULL AND O_ID IN (
    SELECT O_ID FROM vEmployers 
    INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
    WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007' 
) 

truy vấn này về cơ bản đưa ra một con số kinh doanh lặp lại giữa hai giai đoạn 12month.

Vì vậy, tôi tự hỏi tại sao "COUNT (DISTINCT ColumnName)" trả về 1 khi "ColumnName IS NOT NULL" đã được chỉ định?

Dưới đây là một mẫu của các dữ liệu khi chọn top 10 ColumnName DISTINCT TỪ ... vv được điều hành:

1346116 
1346131 
1346425 
1346923 
1349935 
1350115 
1350153 
2594787 
2821944 
2879631 
+0

@GateKiller: bạn hoàn toàn chắc chắn rằng bạn chỉ bỏ qua 'COUNT' và không có gì khác? – Quassnoi

+0

@Quassnoi: Có. – GateKiller

+0

Đánh giá cao sự giúp đỡ của bạn cho đến giờ guys :) – GateKiller

Trả lời

5

Việc sử dụng số (16, 0) khiến tôi nghi ngờ rằng đó là loại dữ liệu có liên quan. Thêm một CAST vào mệnh đề COUNT để chuyển nó vào loại INT:

Count(Distinct Cast(O_ID as Int)) 
+0

Thankyou Turnkey :) – GateKiller

0

Tôi đoán đó là vì tất cả các hàng trả lại phần giá trị tương tự cho O_ID. Bạn có thể thực hiện một số COUNT(*) hoặc COUNT() trên khóa duy nhất cho mỗi hàng để nhận số lượng hàng.

+0

Tất cả các hàng được trả lại là duy nhất vì mệnh đề DISTINCT, được chứng minh bằng cách thực hiện truy vấn với COUNT(). – GateKiller

+0

Bạn có thể cung cấp một đoạn trích ngắn về kết quả mà không đếm được, chỉ hiển thị một vài O_ID không? – Turnkey

+0

Vâng, COUNT (DISTINCT ...) tất nhiên sẽ tính các giá trị không NULL duy nhất, và đó chỉ là nó. Không làm khác biệt, đếm (*) hoặc đếm một cái gì đó duy nhất trên tất cả các hàng của bạn, KHÔNG CÓ mệnh đề DISTINCT. –

0

Xóa DISTINCT và bạn sẽ được tính trên tất cả các hàng.

+0

Đúng. Nhưng như bạn có thể thấy từ truy vấn đầy đủ, có một tham gia tham gia vì vậy điều này sẽ trả về ID trùng lặp. Và nó không trả lời câu hỏi tại sao COUNT() trả về 1 khi không nên. – GateKiller

+0

Vâng, điều đó thật khó hiểu, cảm ơn bạn đã đăng thông tin bổ sung. Bạn đã chạy chính xác cùng một truy vấn để lấy đoạn trích, chỉ cần xóa số lượng? – Turnkey

+0

Vâng, đoạn trích là truy vấn giống hệt nhau mà không sử dụng hàm COUNT(). Rất khó hiểu! – GateKiller

0

Ông có thể chạy các truy vấn này:

SELECT COUNT(DISTINCT O_ID) 
FROM vEmployers 
INNER JOIN 
     vEnrolment 
ON  O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND 
     E_START < '01-AUG-2009' 
     AND O_ID IN 
     (
     SELECT O_ID 
     FROM vEmployers 
     INNER JOIN 
       vEnrolment 
     ON  O_ID = E_EnrolmentEmployer 
     WHERE E_Start < '01-AUG-2008' 
       AND E_Start >= '01-AUG-2007' 
     ) 

SELECT DISTINCT TOP 5 O_ID 
FROM vEmployers 
INNER JOIN 
     vEnrolment 
ON  O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND 
     E_START < '01-AUG-2009' 
     AND O_ID IN 
     (
     SELECT O_ID 
     FROM vEmployers 
     INNER JOIN 
       vEnrolment 
     ON  O_ID = E_EnrolmentEmployer 
     WHERE E_Start < '01-AUG-2008' 
       AND E_Start >= '01-AUG-2007' 
     ) 
ORDER BY 
     O_ID 

đúng nguyên văn, mà không thay đổi bất cứ điều gì?

+0

Truy vấn đầu tiên trả về một hàng có giá trị "1". Truy vấn thứ hai trả về năm hàng các giá trị duy nhất. – GateKiller

+0

@GateKiller: bạn có thể vui lòng đăng cấu trúc của các bảng không? – Quassnoi

+0

Bạn quan tâm đến thông tin nào? Tôi không chắc chắn tôi sẽ được phép đăng lược đồ bảng đầy đủ + mỗi bảng có ALOT cột. – GateKiller

0
SELECT 
    COUNT(*) 
FROM vEmployers 
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
WHERE 
     E_START >= '01-AUG-2008' 
     AND E_START < '01-AUG-2009' 
     AND O_ID IS NOT NULL AND O_ID IN (
      SELECT O_ID FROM vEmployers 
      INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
      WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007' 
     ) 
GROUP BY 
    O_Id 
Các vấn đề liên quan