2015-12-03 11 views
5

Sto utilizzando SQL Server per creare il mio database.Unire il risultato di una colonna Temp a una tabella SQL Server

voglio aggiungere una colonna al mio tavolo che calcolare il numero di valori nulli in ogni riga, in questo modo:

Column1 | Column2 | Column3 | Score 
a  | B  | C  | 0 
x  | NULL | NULL | 2 

Attualmente, ho questo:

Column1 | Column2 | Column3 
a  | B  | C  
x  | NULL | NULL 

ho ho creato una nuova colonna denominata Punteggio e per calcolarla ho utilizzato:

SELECT 
CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END 
As TMP 
FROM MyTable 

Tali resi una colonna con tutte le linee e il punteggio per ogni linea:

|TMP 
1 |0 
2 |2 

desidero aggiornare il punteggio colonna myTable con quei valori.

Grazie per il vostro aiuto.

+2

E 'generalmente una cattiva idea per memorizzare i valori calcolati a seconda su altre colonne. (Ridondanza dei dati, rischio di incoerenza dei dati). Creare invece una vista. Oppure gestisci l'utilizzo dei trigger. – jarlh

risposta

6

Si potrebbe utilizzare una colonna calcolata - una colonna virtuale che viene sempre calcolata con una determinata espressione e non memorizzata d su disco. In questo modo, si evitano problemi con la coerenza dei dati. La sintassi è semplice:

CREATE TABLE myTab 
(
    column1 datatype 
    , column2 datatype 
... 
    , Score AS CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END 
); 

Al fine di modificare la tabella esistente e aggiungere ad una colonna, utilizzare:

ALTER TABLE myTab ADD Score AS CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END 

Fonte: https://msdn.microsoft.com/en-us/library/ms188300.aspx

+0

Il problema è che la mia tabella è già stata creata con i dati, la tua query significa che dovrei creare una nuova tabella, non è vero? – Ayyoub

+0

Oppure modificare quello esistente. 'ALTER TABLE myTab ADD Score As ...' – marmarta

+0

Perfetto, grazie – Ayyoub

2

In genere è una cattiva idea memorizzare i valori calcolati in base alle altre colonne. (. La ridondanza dei dati, il rischio di incoerenza dei dati) Creare una vista invece:

create view MyView as 
SELECT column1, column2, column3, 
     CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END As TMP 
FROM MyTable 
+0

Grazie per la tua risposta +1 L'unica cosa è che non voglio creare una vista, ma aggiornare la mia tabella – Ayyoub

+1

Se vuoi veramente avere quei valori calcolati in una tabella base, fai come Marmarta suggerisce di evitare il rischio di incoerenza dei dati . – jarlh

2
DECLARE @temp TABLE 
(
    Column1 CHAR(1), 
    Column2 CHAR(1), 
    Column3 CHAR(1), 
    Score AS (
     CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END) 
) 

o

CREATE VIEW dbo.vw_Table 
AS 
    SELECT 
      t.Column1 
     , t.Column2 
     , t.Column3 
     , Score = (
      SELECT COUNT(t.val) 
      FROM (
       VALUES 
        (t.Column1), 
        (t.Column2), 
        (t.Column3) 
      ) t(val) 
     ) 
    FROM dbo.test t 
GO 

o

ALTER TABLE dbo.tbl 
    ADD Score AS (
     CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
     CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END) PERSISTED 
GO 
+1

Grazie per la risposta +1 L'unica cosa è che non voglio creare una vista, ma aggiorno il mio tavolo – Ayyoub

+0

perfetta Questa è la risposta si può spiegare a me quello che è il ruolo di PERSISTED – Ayyoub

+1

persistito significare che sql server fisicamente memorizzare le colonne calcolate nella tabella senza operazioni scalari di calcolo – Devart

2
UPDATE mt 
SET Score = t.Tmp 
FROM MyTable mt INNER JOIN (SELECT idx, 
    CASE WHEN Column1 IS NULL THEN 1 ELSE 0 END + 
    CASE WHEN Column2 IS NULL THEN 1 ELSE 0 END + 
    CASE WHEN Column3 IS NULL THEN 1 ELSE 0 END 
FROM MyTable) t ON t.idx = mt.idx 
+0

idx Vuoi dire che dovrei creare un indice sul mio tavolo? e t.Tmp non hai dimenticato di aggiungere As Tmp da qualche parte? – Ayyoub

+0

Sì, avere un indice sarebbe una buona idea. Hai ragione, ho dimenticato di aggiungerlo come alias per la seconda colonna – Simone

Problemi correlati