2011-01-11 22 views
5

Tôi có truy vấn đơn giản sau đây,đâu điều kiện quy định tại khoản trên chức năng tổng hợp

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues 
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID 
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000 
GROUP BY U.US_LOGON_NAME; 

Nơi tôi muốn bổ sung thêm COUNT() chức năng vào danh sách chọn nhưng áp đặt một số nơi có điều kiện trên chúng. Điều này có được thực hiện với câu lệnh CASE() không? Tôi đã thử đặt các mệnh đề Where trong danh sách lựa chọn, và điều đó dường như không được cho phép. Tôi không chắc liệu các truy vấn phụ có thực sự cần thiết ở đây hay không, nhưng tôi không nghĩ vậy.

Ví dụ tôi muốn một COUNT() chức năng mà chỉ đếm các vấn đề trong một phạm vi nhất định, sau đó khác trong phạm vi khác hoặc với điều kiện các loại khác, vv:

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO (condition here) 
COUNT(I.IS_ISSUE_NO (a different condition here) 

vv ...

Vẫn được nhóm theo Tên Đăng nhập.

Cảm ơn.

Trả lời

10
SELECT 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2 
+0

Không 'COUNT' cũng đếm '0'? Tôi nghĩ chỉ 'NULL' không được tính. –

+1

@Kirk Woll: Nó nói COUNT ở đâu trong câu trả lời? –

+0

Có, nhưng Adam không phải là COUNTING, anh ấy là SUMming. –

4

Một vài giải pháp.

Bạn có thể tận dụng thực tế là SQL không tính giá trị NULL:

SELECT US_LOGON_NAME as Username, 
    COUNT(CASE WHEN <cond>  THEN I.IS_ISSUE_NO ELSE NULL END) 
    COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END) 
    . . . 

Hoặc bạn có thể sử dụng SUM thay COUNT:

SELECT US_LOGON_NAME as Username, 
    SUM(CASE WHEN <cond>  THEN 1 ELSE 0 END) 
    SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END) 
    . . . 

Trong cả hai trường hợp, bạn có thể lặp lại như nhiều lần bạn cần.

+1

Tôi nghĩ rằng các biểu thức 'CASE' của bạn có thể là cú pháp không hợp lệ vì không có' END'. –

+0

Tôi nghĩ bạn đúng, thưa bạn. Tôi vừa cập nhật cú pháp. Phải ngừng đổ xô. –

0

Ví dụ trả về số tiền cho mỗi người dùng, trên IssueType.

; 
with 
q_00 as (
select 
     is_issue_no 
    , is_assigned_user_id 
    , case 
      when is_issue_no between 1 and 10 then 'A' 
      when is_issue_no between 11 and 14 then 'B' 
      else 'C' 
     end as IssueType 
from Issues 
) 
select 
     us_logon_name 
    , IssueType 
    , count(1) as cnt 
from q_00 as a 
join users as u on a.is_assigned_user_id = u.us_user_id 
group by us_logon_name, IssueType 
order by us_logon_name, IssueType ; 

SQL server 2005 +

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