2013-08-12 1 views
14

У меня есть таблица, которая содержит 4 столбца, а в 5-м столбце я хочу сохранить подсчет количества ненулевых столбцов из предыдущего 4. Например:Количество ненулевых столбцов в каждой строке

где Х представляет собой любое значение:

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

Зачем вам это нужно? Когда вы этого хотите? Вы хотите, чтобы это было заполнено автоматически? – yoozz

+0

Являются ли эти строковые столбцы? –

ответ

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

Это было намного быстрее. Хорошая работа! – AToya

+0

Не работает с значениями типа даты –

+0

@GuilhermeCamposHazan, но может случиться так, что он не будет работать со столбцами разных типов –

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. Отлично! – 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; 

Демонстрация:

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;