2015-05-21 17 views
5

Tôi đã gặp phải một vấn đề nhỏ và sẽ đánh giá cao bất kỳ trợ giúp nào.SQL Xem liệu hai hoặc nhiều cột trong bảng có lớn hơn 0

Bảng của tôi là như vậy:

CASH | CREDIT CARD | DEBIT CARD | ACCOUNT | OTHER 
------------------------------------------------- 
0.00 0.00   0.00   0.00  0.00 

1.00 0.00   0.00   0.00  0.00 

2.00 1.00   0.00   0.00  0.00 

Mục đích của tôi là để SELECT * FROM bất kỳ hàng trên đó có nhiều hơn một cột> 0.

Vì vậy, hàng thứ ba sẽ được lựa chọn trong trường hợp này với bảng trên.

+0

Vì vậy, bạn đang hỏi gì? Và bạn đã thử cái gì? – ryekayo

+3

Giá trị nào có thể nhỏ hơn 0? – jarlh

+0

4 chọn 2 kết hợp. – Tarik

Trả lời

10
SELECT 
    [CASH], [CREDIT CARD], [DEBIT CARD], [ACCOUNT], [OTHER] 
FROM table 
WHERE 
    CASE WHEN [CASH] > 0 THEN 1 ELSE 0 END+ 
    CASE WHEN [CREDIT CARD] > 0 THEN 1 ELSE 0 END+ 
    CASE WHEN [DEBIT CARD] > 0 THEN 1 ELSE 0 END+ 
    CASE WHEN [ACCOUNT] > 0 THEN 1 ELSE 0 END+ 
    CASE WHEN [OTHER] > 0 THEN 1 ELSE 0 END >= 2 
+0

Yêu thích giải pháp này, ngắn gọn và trang nhã +1 –

+1

khi sử dụng máy chủ sql 2012 trở lên thì ngắn hơn trường hợp khi ...: IIF ([CASH]> 0,1,0) + IIF ([THẺ TÍN DỤNG]> 0, 1.0) .... – CeOnSql

+0

@CeOnSql đúng, nhưng hiệu suất vẫn giống nhau –

1

tôi thích t-clausen's answer nhưng cũng giống như một bài tập, tôi quyết định thử nó như một UNPIVOT theo sau là một PIVOT, để chúng ta có thể viết nó sử dụng nhiều trong những công cụ SQL chung:

declare @t table (SomeID int,Cash money,Credit money,Debit money,Account money,Other money) 
insert into @t(SomeID,Cash,Credit,Debit,Account,Other) values 
(1,0.00,0.00,0.00,0.00,0.00), 
(2,1.00,0.00,0.00,0.00,0.00), 
(3,2.00,1.00,0.00,0.00,0.00) 

;With Unpiv as (
    select *,SUM(CASE WHEN MoneyValue > 0.00 THEN 1 ELSE 0 END) OVER (PARTITION BY SomeID) as cnt 
    from @t t 
     unpivot (MoneyValue for MoneyType in (Cash,Credit,Debit,Account,Other)) x 
), Repiv as (
    select * 
    from Unpiv u 
     pivot (SUM(MoneyValue) for MoneyType in (Cash,Credit,Debit,Account,Other)) x 
    where 
     cnt >= 2 
) 
select * from Repiv 

Điều này giả định rằng bạn có một cột khác (ở đây, được gọi là SomeID) theo đó mỗi hàng có thể được xác định duy nhất.

Kết quả:

SomeID  cnt   Cash     Credit    Debit     Account    Other 
----------- ----------- --------------------- --------------------- --------------------- --------------------- --------------------- 
3   2   2.00     1.00     0.00     0.00     0.00 

Chỉ hy vọng ở trên có thể thích nghi hơn đối với một số biến thể của các yêu cầu.

1
SELECT 
    [CASH], [CREDIT CARD], [DEBIT CARD], [ACCOUNT], [OTHER] 
FROM table 
WHERE (
    SELECT COUNT(*) 
    FROM (VALUES ([CASH]),([CREDIT CARD]),([DEBIT CARD]),([ACCOUNT]),([OTHER])) t(value) 
    WHERE value > 0 
) >= 2 
Các vấn đề liên quan