2013-08-12 8 views
14

Mam tabelę, która zawiera 4 kolumny, aw piątej kolumnie chcę zapisać liczbę niezerowych kolumn z poprzednich 4. Na przykład:Liczba niezerowych kolumn w każdym wierszu

Gdzie X jest dowolna wartość:

Column1 | Column2 | Column3 | Column4 | Count 
    X  | X | NULL | X | 3 
NULL | NULL | X | X | 2 
NULL | NULL | NULL | NULL | 0 
+0

Dlaczego tego chcesz? Kiedy tego chcesz? Czy chcesz to wypełnić automatycznie? – yoozz

+0

Czy są to kolumny tekstowe? –

Odpowiedz

19
select 
    T.Column1, 
    T.Column2, 
    T.Column3, 
    T.Column4, 
    (
     select count(*) 
     from (values (T.Column1), (T.Column2), (T.Column3), (T.Column4)) as v(col) 
     where v.col is not null 
    ) as Column5 
from Table1 as T 
+0

To było dużo szybciej. Dobra robota! – AToya

+0

Nie działa z wartościami typu daty –

+0

@GuilhermeCamposHazan ma, ale może się zdarzyć, że nie będzie działał z kolumnami różnych typów –

10
SELECT Column1, 
     Column2, 
     Column3, 
     Column4, 
     CASE WHEN Column1 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column4 IS NOT NULL THEN 1 ELSE 0 END AS Column5 
FROM  Table 
+0

Awesome. Działa doskonale! – AToya

1
SELECT Column1, Column2, Column3, Column4, 
    Column5 = LEN(COALESCE(LEFT(Column1,1),'')) 
      + LEN(COALESCE(LEFT(Column2,1),'')) 
      + LEN(COALESCE(LEFT(Column3,1),'')) 
      + LEN(COALESCE(LEFT(Column4,1),'')) 
FROM dbo.YourTable; 

Demo:

DECLARE @x TABLE(a VARCHAR(32),b INT,c VARCHAR(32),d VARCHAR(32)); 

INSERT @x VALUES 
('01',3023,NULL,'blat'), 
('02',NULL, NULL,'blat'), 
('03',5,NULL,'blat'), 
('04',24,'bo','blat'), 
(NULL, NULL, NULL, NULL); 

SELECT a, b, c, d, 
    LEN(COALESCE(LEFT(a,1),'')) 
    + LEN(COALESCE(LEFT(b,1),'')) 
    + LEN(COALESCE(LEFT(c,1),'')) 
    + LEN(COALESCE(LEFT(d,1),'')) 
FROM @x;