2013-08-12 13 views
14

Ho una tabella che contiene 4 colonne e nella 5a colonna voglio memorizzare il conteggio di quante colonne non nulli ci sono rispetto alle precedenti 4. Ad esempio:Conteggio di colonne non null in ogni riga

dove x è un valore:

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

perché vuoi questo? Quando lo vuoi? Vuoi che venga compilato automaticamente? – yoozz

+0

Queste colonne di stringhe sono? –

risposta

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

Questo è stato molto più veloce. Buon lavoro! – AToya

+0

Non funziona con i valori di tipo data –

+0

@GuilhermeCamposHazan, ma potrebbe non funzionare con colonne di tipi diversi –

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

Fantastico. Ha funzionato perfettamente! – 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; 
Problemi correlati