• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テーブルの並び替え)

テーブルの並び替え方法とは?

このQ&Aのポイント
  • 仕事で使うdbを初心者でも分かりやすく並べ替える方法を教えてください。
  • テーブルの中身を指定の形式に並び替える方法を教えてください。
  • テーブルデータを別の形式に変換する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.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

tentakun39
質問者

お礼

さっそくやってみます。ありがとうございます。

その他の回答 (4)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.4

> 別テーブルへ並べ替えたい に対する回答として、 > テーブルのスキーマ設計にも影響します。 > システムの再考をされたほうが良いでしょう。 なのです。 > 最大20「くらい」にはなりそうです。不可能でしょうか? という再質問の件ですが、確実に20件以下であるとわかっているなら、 プログラムを組めば「別テーブルに」することは可能です。 でも、「くらい」が付くということはわからないということですよね。 そしたら、20件分のつもりでカラムを40個(code1とcode2の組が20個分) 作ったとして、21件目が来たらどこにいれるんです? 入れられないという現象が発生しますよね? つまり、「別テーブルに」は不可能なんです。 なので、ANo.2さんがおっしゃっているように、プログラムで処理をして 見せ掛けのテーブルを表形式で見せればよいとおもいます。 見えているだけなので、テーブルにはその結果は残っていません。 残っていませんが、いつでもそのプログラムで最新の状態でみることはできるので、問題ないかと思います。 システムの再考を と言ったのはそういうことです。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>プログラム=VBAということですか? Accessですか? Accessを使っているなら、VBAですね。 件数が少ないなら、Excelに貼り付けてExcelのVBAで処理した方が簡単かもしれません。 Access+VBAの知識は多少有りますので、Accessだったら、お手伝いできるかもしれません。 やりたいことは、 ・同じIDのものを横に並べる ・最大20個程度 ということで合ってますか?

tentakun39
質問者

補足

その通りです。 VBAの書き方を教えてくれませんか?

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>あるdb 具体的に何を使っているか分からないと回答しにくいですよ。 >主キー ID  code1 code2 >222 33 あ   B  >222 33 う   c  主キーが重複してますよ。間違っていませんか? >主キー ID codeA codeB codeC codeD 通常データベースとしては不可能な並べ替え(集計)です。 作業用のテーブルなど駆使すればデータベースとSQLのみで、処理できるかもしれませんが、何らかのプログラムを書いて処理するべき内容だと思います。

tentakun39
質問者

補足

確かに重複していますね。すみません。 プログラム=VBAということですか?

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

正規化の逆方向へのデータ移動になるので、無理だとおもいます。 この例だと2個なので、codeA,codeB,codeA_2,codeB_2だけで済んでますが、 3個なら?4個なら?・・・・とどんどんレコード内のカラム数が増えてしまいますので、 テーブルのスキーマ設計にも影響します。 システムの再考をされたほうが良いでしょう。

tentakun39
質問者

補足

最大20くらいにはなりそうです。不可能でしょうか?