9

私はこのようなテーブルをたくさん持っています:

Lookup_HealthCheckupRisks
------------
ID  Name
1   Anemia
2   Anorexic
3   Bulemic
4   Depression
...
122   Syphilis



PatientRisksOnCheckup
------------------
ID CheckupID RiskID
1  11        2
2  11        3
3  12        1
4  14        1
5  14        3
...

しかし、私はこのようなフラット化されたバージョンが必要です:

PatientCheckup
------------------
CheckupID Risk_1 Risk_2 Risk_3 Risk_4 .. Risk_122
11        0      1      1      0         0
12        1      0      0      0         0
13        0      0      0      0         0
14        1      0      1      0         0

これを行う方法がわかりません。考えられる最善の方法は、一時テーブルを作成し、122列すべてを定義してから、>_<If Exists ( SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j ) INSERT INTO PatientCheckup (1) WHERE CheckupID=jを繰り返し実行することです。i, j...

1つのテーブルに対してこのクエリを作成するのは最善ではありませんが、同じサイズの別の30のテーブルに対してこのようなデータをフラット化する必要があります。えーと…提案してください?

私がしていることが一般的なことであるかどうかも知りたいです...?

統計ソフトウェアのSQLデータを非正規化/フラット化する必要があります。

4

3 に答える 3

10

必要なのはクロス集計クエリと呼ばれます。

Microsoft SQL Serverを使用している場合は、PIVOT演算子を使用して実行できます。

他のブランドのRDBMSは、このタイプのクエリをさまざまにサポートしています。最悪の場合、動的SQLを使用して、ルックアップテーブルの値をメインテーブルへの結合にハードコーディングする必要があります。122の異なる値がある場合、これは実用的ではありません。

ピボットまたはクロス集計のタグが付いたSOの質問も参照してください。

于 2009-09-22T17:38:38.870 に答える
1

ここでピボットテーブルを使用します-Microsoftとここで-チュートリアル

すべての列を指定するには、hovewerが必要です。ただし、sp_executesqlコマンドを使用して動的SQLを使用できます。

于 2009-09-22T17:40:42.137 に答える
-1

これらの非正規化されたテーブルがいっぱいになるように、INSERT AND UPDATE、DELETEでトリガーを使用するのはどうですか...

于 2013-03-02T07:01:28.403 に答える