2010-07-07 36 views
40

Tôi cần trợ giúp về truy vấn T-SQL. Tôi muốn đếm các trường có giá trị đặc biệt (ví dụ: 1).T-SQL Đếm hàng với các giá trị cụ thể (Truy vấn nhiều trong một)

Giả sử tôi có một bảng như:

IGrp | Item | Value1 | Value2 
############################# 
A | I11 | 0.52 | 1.18 
A | I12 | 1.30 | 0.54 
A | I21 | 0.49 | 2.37 
B | I22 | 2.16 | 1.12 
B | I31 | 1.50 | 0.28 

Tôi muốn có một kết quả như:

IGrp | V1High | V2High 
###################### 
A | 1  | 2 
B | 2  | 1 

Trong tâm trí của tôi này nên đi với biểu hiện này

SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High 
FROM Tbl GROUP BY IGrp 

Nhưng đó không thể có trong T-SQL vì Count() không có giá trị boolean. Vì vậy, nó thực sự là cách duy nhất để thực hiện nhiều truy vấn với WHERE Value>1COUNT(*) và tham gia sau đó? Hoặc là có một thủ thuật để đạt được kết quả mong muốn?

Xin cảm ơn trước.

Trả lời

64
SELECT IGrp, 
    COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High, 
    COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High 
FROM Tbl 
GROUP BY IGrp 
+0

Bất kỳ ý tưởng nào về điều này ảnh hưởng đến hiệu suất như thế nào? – BrianFinkel

+2

Dựa trên kinh nghiệm của tôi, SQL Server có thể hoạt động tốt với lệnh này. – jing

0

Bạn có thể đặt CASE .. WHEN .. statement bên trong hàm COUNT() để trả về 1 khi điều kiện giữ, NULL nếu không.

3

làm sử dụng case when sẽ làm việc cho bạn

SELECT IGrp, 
sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High, 
sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High 
FROM Tbl GROUP BY IGrp 
+0

Cảm ơn, bằng cách nào đó tôi đã không nghĩ về điều này. – Marks

+2

Điều này sẽ không hoạt động. Tất cả các giá trị không null đều được tính vào số đếm. – LukeH

+0

bây giờ điều này cũng sẽ chăm sóc các giá trị null –

9

Bạn có thể sử dụng CASE tuyên bố:

SELECT IGrp, 
    SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High, 
    SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High 
FROM Tbl GROUP BY IGrp 
+2

Điều này sẽ không hoạt động. Tất cả các giá trị không null đều được tính vào số đếm. – LukeH

+1

@ LukeH - vâng bạn nói đúng, ý tôi là SUM ... – cjk

+0

@HoseynHeydari no, kiểm tra chỉnh sửa, tôi đã sửa và ví dụ bây giờ là chính xác. Nếu câu trả lời sai trên SO, nó sẽ bị xóa. – cjk

2
SELECT IGrp, 
    COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo, 
    COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah 
FROM Tbl 
GROUP BY IGrp 

này cũng có thể được sử dụng để so sánh 2 giá trị khác nhau cho cùng một trường, với những thay đổi nhỏ như được hiển thị ở trên.

Rất hữu ích để xác minh các giá trị được cho là tồn tại ở tỷ lệ 1: 1.

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