2015-05-21 10 views
5

Natknąłem się na mały problem i doceniam każdą pomoc.SQL Sprawdź, czy dwie lub więcej kolumn w tabeli jest większe niż 0

My Tablica jest taka:

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 

My celem jest SELECT * FROM dowolnego z powyższych rzędami, które mają więcej niż jedną kolumnę> 0.

więc trzeci rząd zostanie wybrany w tym przypadku z powyższa tabela.

+0

Więc o co pytasz? I co próbowaliście? – ryekayo

+3

Czy jakiekolwiek wartości mogą być mniejsze niż 0? – jarlh

+0

4 wybierz 2 kombinacje. – Tarik

Odpowiedz

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

Kochając to rozwiązanie, zwięzłe i eleganckie +1 –

+1

przy użyciu serwera sql 2012 lub nowszym jest to krótsze niż w przypadku, gdy ...: IIF ([CASH]> 0,1,0) + IIF ([KARTA KREDYTOWA]> 0, 1,0) .... – CeOnSql

+0

@CeOnSql prawda, ale wydajność jest wciąż taka sama –

1

Wolę t-clausen's answer ale tylko jako ćwiczenie, postanawiam spróbować go jako UNPIVOT następnie PIVOT, tak, że możemy napisać, że przy użyciu bardziej ogólnych narzędzi SQL:

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 

Zakłada to, że masz kolejną kolumnę (tutaj o nazwie SomeID), dzięki której każdy wiersz może zostać jednoznacznie zidentyfikowany.

Wynik:

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

tylko nadzieję powyższe może być bardziej dostosowane do niektórych wariantów wymagań.

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