2010-12-14 29 views
10

Là một phần của tổng hợp phức tạp, tôi muốn biết số tiền bitwise của một số dữ liệu, ví dụ: nếu tôi có các hàng có giá trị 1,1,1,2,2,8 thì số tiền bitwise 11. Trong trường hợp này các giá trị là tất cả các quyền hạn chính xác của hai (một bit), vì vậy tôi có thể hack xung quanh nó bằng cách nhóm và tổng hợp qua các nhóm (rõ ràng ví dụ này hơi bị tra tấn so với truy vấn thực):Thực hiện tổng bitwise

select SUM(y.test) 
from (
    select x.test 
    from (-- garbage test data 
     select 1 as [test] 
     union all select 1 
     union all select 1 
     union all select 2 
     union all select 2 
     union all select 8) x 
group by x.test) y 

nhưng có cách nào gọn gàng để thực hiện tổng bitwise trong [T] SQL không?

+0

Marc, về cơ bản bạn đang nói về ORING tất cả các giá trị đó? Hoặc bạn có nghĩa là loại bỏ các bản sao đầu tiên, sau đó thêm (không chắc chắn tôi muốn sử dụng thuật ngữ bitwise cho rằng mặc dù)? – paxdiablo

+0

@paxdiablo cả hai; bitwise OR trên tập hợp sẽ giống hệt với bổ sung duy nhất, vì mỗi là một sức mạnh tuyệt đối của 2 –

Trả lời

18

Nếu tất cả giá trị thử nghiệm của bạn là các bit đơn như trong ví dụ của bạn (1, 2, 8) - chỉ cần sử dụng SUM(DISTINCT col) trong truy vấn của bạn.

Hy vọng điều đó sẽ hữu ích.

(Để tham khảo: http://msdn.microsoft.com/en-us/library/ms187810.aspx)

+0

Hahaha. câu trả lời chính xác! –

+0

Đẹp; Tôi thích cách tiếp cận đó; hoạt động đẹp –

0

Bạn có nhà điều hành | thực hiện bitwise hoặc cho 2 toán hạng. Có thể giải quyết vấn đề của bạn bằng cách sử dụng con trỏ và toán tử này.

Chỉnh sửa có Tôi đã trộn lẫn và sửa lỗi.

3

Một chút phức tạp nhưng điều này làm những gì bạn đang theo dõi (lưu ý rằng ive có bit lên đến 128, bạn có thể cần phải cao hơn hoặc có thể không cần phải cao hơn 8).

with data(i) 
AS 
(
    select 1 
     union all select 1 
     union all select 1 
     union all select 2 
     union all select 2 
     union all select 8 
) 
SELECT MAX(i & 1) + 
MAX(i & 2) + 
MAX(i & 4) + 
MAX(i & 8) + 
MAX(i & 16) + 
MAX(i & 32) + 
MAX(i & 64) + 
MAX(i & 128) 
from data 

rõ ràng có thể được chuyển thành UDF nếu bạn muốn.

+0

Tôi đang cố gắng tìm ra cách chuyển đổi nó thành UDF. bạn có thể giải thích về điều đó không? – Gabe

0

Đối bit duy nhất SUM (DISTINCT col) là câu trả lời tốt nhất nhưng đối với nhiều bit như 3 (= 1 | 2) này không làm việc và tốt nhất và câu trả lời nhanh hơn sẽ là như thế này:

CHỌN SUM (DISTINCT X.Text & TB) TỪ X tham gia chéo (giá trị (1), (2), (4), (8), (16), (32), (64), (128), (256), (512)) T (B)

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