0

入力データのテーブルが与えられた場合、同じレコードの兄弟列を記述する「フラグ列」のセットが必要です。

  • Microsoft SQLServer2005を使用しています
  • まず、ターゲットテーブルにデータをロードする必要があります。次に、これらのフラグ列に値を配置するためのチェックを実行する必要があります。

たとえば、次のようなおもちゃのテーブルがあるとします。

CREATE TABLE zzz_test
             (
                          color        VARCHAR(10),
                          value_x      INTEGER    ,
                          value_y      INTEGER    ,
                          value_x_FLAG bit        ,
                          value_y_FLAG bit
             )

次に、次のおもちゃのデータがあります(「古い」2005 SQLバージョンのため、すべてのレコードに対してINSERT / VALUESステートメントを繰り返す必要があります)。

INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',NULL,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',NULL,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,3)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',NULL,1)
INSERT zzz_test(color,value_x,value_y)
VALUES(NULL,3,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',1,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',3,4)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',1,1)
INSERT zzz_test(color,value_x,value_y)
VALUES('blue',5,NULL)

ここで、値を内部に配置し、兄弟列とがであるかどうかvalue_x_FLAGを評価する簡単な方法が必要です。value_y_FLAGvalue_xvalue_yNULL

ISNULL()、、、などの関数があることは知っていますが、別の列の値を指定して列を更新しようとしてCOALESCE()いるため、これは当てはまらないと思います。

ステートメントを使用できることは知っていますIF / ELSEが、フラグ変数の同じ「更新」ステートメントですべて一緒に機能するように、多くのブールフラグ(2 ^ n)のすべてのケースを設定するのは非常に複雑です。

どのように対処しますか?

すべてのフラグを設定した後、何らかの方法でテーブルを要約したいと思います。たとえば、COUNTすべてのフラグ変数にを設定したい場合はCOUNT、「色のカテゴリ」を指定します。

おそらく、サポートフラグ変数のセットは必要ありませんが、テーブルをはるかに読みやすくし、SQLコードもはるかに読みやすくするためにそれらを使用したいと思います。ありがとう!

4

1 に答える 1

2

これを試してみてください、すべての挿入の後、

update zzz_test set value_x_FLAG = CASE value_x when null then 1 else 0 END, value_y_FLAG = CASE value_y when null then 1 else 0 END

それがうまくいくことを願っています!

編集:カウントについては、フラグをどこかに保存する代わりに、必要なときにいつでもgroupby句を使用できます

select Color, Count(value_x_FLAG) from zzz_test  group by Color having value_x_FLAG != 0

これにより、2列のテーブルが返されます。色と整数は、フラグが1の行数です。

于 2012-06-07T13:00:55.467 に答える