- ベストアンサー
テーブルの並び替え方法とは?
- 仕事で使うdbを初心者でも分かりやすく並べ替える方法を教えてください。
- テーブルの中身を指定の形式に並び替える方法を教えてください。
- テーブルデータを別の形式に変換する方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#3です。補足が付いていたことに気づきませんでした。回答が遅くなりました、ごめんなさい。 作業用テーブルと、クエリで集計する方法です。下のプログラムは集計準備用のプログラムなので1回実行するだけで結構です。集計結果は Q4 というクエリです。 以下プログラム。テーブル名などは適当に変更してください。 Const T1 = "T1" '集計したいテーブルの名前 Const Q4 = "Q4" '集計結果のクエリの名前 Const T2 = "T2" '作業用のテーブルの名前 Const Q1 = "Q1" '作業用のクエリの名前 Const Q2 = "Q2" '作業用のクエリの名前 Const Q3 = "Q3" '作業用のクエリの名前 Const MAX = 26 'コードの数 Sub 集計準備() Dim sql As String Dim i As Integer On Error Resume Next DoCmd.SetWarnings False '作業用テーブル作成 DoCmd.DeleteObject acTable, T2 sql = "CREATE TABLE [" & T2 & "] (NO INTEGER primary key," For i = 1 To MAX sql = sql & "F" & Trim(Str(i)) & " INTEGER" If i < MAX Then sql = sql & ", " Next sql = sql & ");" DoCmd.RunSQL sql For i = 1 To MAX sql = "INSERT INTO [" & T2 & "] (No, F" & Trim(Str(i)) & ") VALUES (" & i & ",1);" DoCmd.RunSQL sql Next '作業用クエリ作成 DoCmd.DeleteObject acQuery, Q1 sql = "SELECT X.主キー, X.ID, Count(Y.ID) AS [No] FROM [" & T1 & "] AS X INNER JOIN [" & T1 & "] AS Y ON X.ID = Y.ID WHERE (((Y.主キー)<=[X].[主キー])) GROUP BY X.主キー, X.ID;" CurrentDb.CreateQueryDef Q1, sql DoCmd.DeleteObject acQuery, Q2 sql = "SELECT Q1.主キー, Q1.ID, Q1.No, " For i = 1 To MAX sql = sql & "IIf(T2.F" & Trim(Str(i)) & ",主キー,Null) AS C" & Trim(Str(i)) If i < MAX Then sql = sql & ", " Next sql = sql & " FROM [" & Q1 & "] AS Q1 INNER JOIN [" & T2 & "] AS T2 ON Q1.No=T2.No;" CurrentDb.CreateQueryDef Q2, sql DoCmd.DeleteObject acQuery, Q3 sql = "SELECT Min(Q2.主キー) AS 主キー, Q2.ID, " For i = 1 To MAX sql = sql & "Min(Q2.C" & Trim(Str(i)) & ") AS C" & Trim(Str(i)) If i < MAX Then sql = sql & ", " Next sql = sql & " FROM [" & Q2 & "] AS Q2 GROUP BY Q2.ID;" CurrentDb.CreateQueryDef Q3, sql DoCmd.DeleteObject acQuery, Q4 sql = "SELECT [Q3].[主キー], [Q3].[ID], " For i = 1 To MAX sql = sql & "Dlookup('Code1','[" & T1 & "]','主キー=' & nz(C" & Trim(Str(i)) & ",-1)) AS code" & Right(Str(i * 2 + 100 - 1), 2) & ", " sql = sql & "Dlookup('Code2','[" & T1 & "]','主キー=' & nz(C" & Trim(Str(i)) & ",-1)) AS code" & Right(Str(i * 2 + 100), 2) If i < MAX Then sql = sql & ", " Next sql = sql & " FROM [" & Q3 & "] AS Q3;" CurrentDb.CreateQueryDef Q4, sql DoCmd.SetWarnings True End Sub
その他の回答 (4)
- PED02744
- ベストアンサー率40% (157/390)
> 別テーブルへ並べ替えたい に対する回答として、 > テーブルのスキーマ設計にも影響します。 > システムの再考をされたほうが良いでしょう。 なのです。 > 最大20「くらい」にはなりそうです。不可能でしょうか? という再質問の件ですが、確実に20件以下であるとわかっているなら、 プログラムを組めば「別テーブルに」することは可能です。 でも、「くらい」が付くということはわからないということですよね。 そしたら、20件分のつもりでカラムを40個(code1とcode2の組が20個分) 作ったとして、21件目が来たらどこにいれるんです? 入れられないという現象が発生しますよね? つまり、「別テーブルに」は不可能なんです。 なので、ANo.2さんがおっしゃっているように、プログラムで処理をして 見せ掛けのテーブルを表形式で見せればよいとおもいます。 見えているだけなので、テーブルにはその結果は残っていません。 残っていませんが、いつでもそのプログラムで最新の状態でみることはできるので、問題ないかと思います。 システムの再考を と言ったのはそういうことです。
- venzou
- ベストアンサー率71% (311/435)
>プログラム=VBAということですか? Accessですか? Accessを使っているなら、VBAですね。 件数が少ないなら、Excelに貼り付けてExcelのVBAで処理した方が簡単かもしれません。 Access+VBAの知識は多少有りますので、Accessだったら、お手伝いできるかもしれません。 やりたいことは、 ・同じIDのものを横に並べる ・最大20個程度 ということで合ってますか?
補足
その通りです。 VBAの書き方を教えてくれませんか?
- venzou
- ベストアンサー率71% (311/435)
>あるdb 具体的に何を使っているか分からないと回答しにくいですよ。 >主キー ID code1 code2 >222 33 あ B >222 33 う c 主キーが重複してますよ。間違っていませんか? >主キー ID codeA codeB codeC codeD 通常データベースとしては不可能な並べ替え(集計)です。 作業用のテーブルなど駆使すればデータベースとSQLのみで、処理できるかもしれませんが、何らかのプログラムを書いて処理するべき内容だと思います。
補足
確かに重複していますね。すみません。 プログラム=VBAということですか?
- PED02744
- ベストアンサー率40% (157/390)
正規化の逆方向へのデータ移動になるので、無理だとおもいます。 この例だと2個なので、codeA,codeB,codeA_2,codeB_2だけで済んでますが、 3個なら?4個なら?・・・・とどんどんレコード内のカラム数が増えてしまいますので、 テーブルのスキーマ設計にも影響します。 システムの再考をされたほうが良いでしょう。
補足
最大20くらいにはなりそうです。不可能でしょうか?
お礼
さっそくやってみます。ありがとうございます。