2011-08-29 41 views
5

Tôi có một bảng lưu trữ nhiều mục cho một tiểu bang và tôi muốn được tính cho mỗi tiểu bang theo các điều kiện cụ thể. Tôi đã viết truy vấn này:Trường hợp và số đếm trong SQL Server 2008

SELECT 
    State_ID, 
    State_Name, 
    State_All= CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END 
    State_w= CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END 
    State_s= CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END 
FROM 
    tblStates 

nhưng tôi nhận được lỗi này:

Column 'State_ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Khi tôi thêm GROUP BY khoản Đối State_ID, tôi đã ở trên lỗi một lần nữa cho STATE_NAME, và khi thêm STATE_NAME để GROUP BY khoản, tôi đã nhận lỗi cho State_All, State_w, State_s.

Tôi không có cột có tên State_All, State_w, State_s trong bảng của tôi.

Làm thế nào tôi có thể được tính theo điều kiện cụ thể mà không cần sử dụng CURSORS?

Trả lời

0

này sẽ sửa chữa nó?

SELECT 
    State_ID, 
    State_Name, 
    CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END AS State_All, 
    CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END AS State_w, 
    CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END AS State_s 
FROM 
    tblStates 
GROUP BY State_ID, State_Name 
+0

Bạn chỉ thay đổi cách các cột là bí danh. OP đã thử GROUP BY – gbn

0

Bạn nên thêm cả hai cột vào cuối truy vấn của bạn:

GROUP BY State_ID, State_Name 
+0

tôi đã nói khi tôi thêm 'GROUP BY State_ID, State_Name' agian Tôi gặp lỗi cho State_All, .... – Arian

+0

Nó không rõ ràng từ câu hỏi của bạn, tôi nghĩ bạn có nghĩa là bạn đã cố gắng State_ID và sau đó cố gắng State_Name thay thế. –

11

Bạn đang đi đúng hướng.

Bạn đặt điều kiện bên trong COUNT như thế này. COUNT bỏ qua NULLs (đó là ELSE ngụ ý trong CASE), do đó bạn chỉ đếm các kết quả phù hợp thực sự. Bạn cũng cần GROUP BY.

lỗi của bạn xuất phát từ việc sử dụng các type1 và type2 ngoài COUNT

SELECT 
    State_ID, 
    State_Name, 
    State_All = COUNT(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = COUNT(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = COUNT(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name 
+0

Công việc tuyệt vời mà anh ấy sửa là sai lầm của tôi. Hãy ghi nhớ những gì nếu type1 = 1 và type2 = 2 là tốt :) – JTWebMan

3

Bạn có thể thay đổi Đếm để SUM vì mỗi kết quả kỷ lục 1

SELECT 
    State_ID, 
    State_Name, 
    State_All = SUM(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = SUM(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = SUM(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name