- 締切済み
SQL Server テーブル設計で悩んでいます。
SQL Server 2008 R2 Visual Studio 2008 テーブルの設計で悩んでいます。 テーブルAのようなデータがあり、実際には、場所のNo.の数は500点くらいあります。 このデータをSQL to LINQでデータの追加、参照をしたいと思っています。 テーブルA,B、どちらの形式で設計する方がよいのでしょうか。 テーブルAの場合は、見た目がそのままで分かりやすいのですが、データ追加時(INSERT)に多数のデータを 追加する方法が分かりません。 テーブルBの場合は、テーブルAの形式で取得する場合、どうすればよいのか分かりません。 ここから先に進めず困っております。よろしくお願いします。 テーブルA 日付 No.1 No.2 No.3 No.4 No.5 2011/1/1 0 68 37 41 38 2011/1/2 3 60 3 69 46 2011/1/3 22 89 63 14 77 2011/1/4 75 8 55 46 41 2011/1/5 63 92 1 26 90 2011/1/6 61 23 77 42 93 2011/1/7 54 52 36 44 41 2011/1/8 72 98 30 66 48 2011/1/9 20 3 89 15 59 テーブルB 日付 場所 線量 2011/1/1 No.1 0 2011/1/1 No.2 68 2011/1/1 No.3 37 2011/1/1 No.4 41 2011/1/1 No.5 38 2011/1/2 No.1 3 2011/1/2 No.2 60 2011/1/2 No.3 3 2011/1/2 No.4 69 2011/1/2 No.5 46
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- satomi3951
- ベストアンサー率71% (98/137)
PIVOT使ってできそう。 実行してないから、エラーになったらゴメン。 SELECT 日付, [No.1], [No.2], [No.3], [No.4], [No.5] FROM ( SELECT 日付, 場所, 線量 FROM テーブルB ) T PIVOT ( SUM(線量) FOR [日付] IN ([No.1], [No.2], [No.3], [No.4], [No.5]) )
- kool_noah
- ベストアンサー率33% (95/285)
よくわからんのですが・・ 要は日付とNo.(場所?)とそのNoの線量のデータを扱いたいってことですよね? で、テーブルAの 日付 No.1 No.2 No.3 No.4 No.5... だと、わかりやすいけど、Noが500ぐらいあるから横に長くなると なので、テーブルBみたいな案を考えたけどどっちがいいですか?ってことですか? No.が500で打ち止めなら別にAでいいような気もしますけど、無駄に横にながくなりますけどね。 1レコード1Noでもいいのでは? PK No. 線量 日付 1 No.1 100 2011/1/1 2 No.1 110 2011/1/1 3 No.2 120 2011/1/1 4 No.3 130 2011/1/1 5 No.3 140 2011/1/2 で、取得する際に日付とかNoで絞り込んだり集計したりお好きなように。 最終的にどうデータを取りたいのか、どう管理したいのかが、よくわからんので適当な回答ですが、すいません
補足
早速の回答、ありがとうございます。 データベース始めたところなので、助かります。 >1レコード1Noでもいいのでは? 私も、正規化というのを知り、その方がいいのかなと思ったのですが、 テーブルBからテーブルAにする仕方がどうしても分かりませんでした。 INNER JOIN というので、結合していくにしても、数が多すぎて現実的ではありません。 なにかいい方法がありますでしょうか。
補足
回答ありがとうございます。 PIVOTで出来ました! ただ、テーブルBからテーブルAにするのは、時間がものすごく掛かることが分かりました。 テーブルAで設計しようと思います。 そこで、INSERTの方法が分からないですが、 場所はNo.1~No.500あるとします。 datetimeの変数と要素数500の配列のようなものをインサートする方法などあるのでしょうか? 500個の場所のパラメータを用意するとできるのでしょうが、もっといい方法はあるのでしょうか? よろしければおしえてください。