2015-12-03 19 views
5

データベースを作成するのにSQL Serverを使用しています。Temp列の結果をテーブルに結合するSQL Server

私はこのように、各行のNULL値の数を計算することになる私の表に列を追加したい:

​​

現在、私はこれがあります。

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

を私は持っていますScoreという新しい列が作成されました。計算には、次のように使用しています。

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 

私はそれらの値にMYTABLEの列スコアを更新したいと思います

|TMP 
1 |0 
2 |2 

:私のすべての行と行ごとにスコアの列。

ありがとうございました。

+2

それが依存する計算値を格納するための悪い考えが一般的です他の列に表示されます。 (データの冗長性、データの矛盾のリスク。)代わりにビューを作成します。トリガーを使用して管理することもできます。 – jarlh

答えて

6

を - 指定された式で常に計算され、ストアされない仮想列ディスク上のd。このようにして、データの一貫性に関する問題を回避できます。構文は簡単です:

既存のテーブルを変更し、そのような列、使用を追加するために
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 
); 

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 

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

+0

問題は私のテーブルは既にデータで作成されています、あなたのクエリは私が新しいテーブルを作成すべきであることを意味しますか? – Ayyoub

+0

または既存のものを変更してください。 – marmarta

+0

パーフェクト、ありがとう – Ayyoub

2

計算された値を他の列に応じて格納することは、一般的には悪い考えです。 (データの冗長性、データの矛盾のリスク。)の代わりにビューを作成します。

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

あなたの答え+1ありがとう唯一のことは、私はビューを作成したくないが、私のテーブルを更新することです – Ayyoub

+1

本当にそれらの計算された値をベーステーブルに入れたいのであれば、marmartaはデータの不一致。あなたの答えため – 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) 
) 

または

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 

または

あなたは計算列を使用することができ
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

おかげで唯一のことは、私はビューを作成したいが、私のテーブル – Ayyoub

+0

パーフェクトを更新していけないということです回答 だというメッセージがPERSISTED – Ayyoub

+1

の役割は物理的にそのSQL Serverのを意味する永続化されているものを私に説明することができます計算スカラー演算なしで計算された列を格納 – 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テーブルにインデックスを作成する必要がありますか? およびt。あなたはTmpをどこかに追加することを忘れていませんか? – Ayyoub

+0

はい、インデックスを作成することをお勧めします。あなたは正しいです、私は2番目の列の別名としてそれを追加することを忘れました – Simone

関連する問題