Tôi đang sử dụng SQL Server 2005. Với truy vấn dưới đây (đơn giản hóa từ truy vấn thật của tôi):Đếm giá trị khác biệt và Null được loại bỏ bởi một tổng hợp
select a,count(distinct b),sum(a) from
(select 1 a,1 b union all
select 2,2 union all
select 2,null union all
select 3,3 union all
select 3,null union all
select 3,null) a
group by a
Có cách nào để làm một số khác biệt mà không cần nhận được
"Cảnh báo: Giá trị rỗng được loại bỏ bằng phép toán tổng hợp hoặc hoạt động SET khác".
Sau đây là các lựa chọn thay thế tôi có thể nghĩ:
- ANSI_WARNINGS Tắt
Tách thành hai truy vấn, một với số lượng khác nhau và một mệnh đề where để loại bỏ null, một với tổng:
select t1.a, t1.countdistinctb, t2.suma from ( select a,count(distinct b) countdistinctb from ( select 1 a,1 b union all select 2,2 union all select 2,null union all select 3,3 union all select 3,null union all select 3,null ) a where a.b is not null group by a ) t1 left join ( select a,sum(a) suma from ( select 1 a,1 b union all select 2,2 union all select 2,null union all select 3,3 union all select 3,null union all select 3,null ) a group by a ) t2 on t1.a=t2.a
Bỏ qua các cảnh báo trong các khách hàng
Có cách nào tốt hơn để thực hiện việc này không? Tôi có thể sẽ đi xuống tuyến đường 2, nhưng không thích sao chép mã.
Tôi nghĩ rằng mã cũ của bạn là tốt, cơ sở dữ liệu không nên rắc rối bạn với những bất ngờ đó là lý do tại sao nó tăng một cảnh báo, bởi vì một số lập trình viên có thể nghiêng để nghĩ rằng DISTINCT nên bao gồm đếm nulls dù sao đi nữa. Tôi nghĩ rằng cảnh báo cảnh báo là ANSI SQL-conforming. –
Giải thích của bạn có ý nghĩa. Tuy nhiên, tôi không thích cảnh báo nếu tôi có thể tránh được chúng. –