• ベストアンサー

access2010  同一idを列に追加

access2010についてselectの方法を教えてください。 ↓元テーブル id | name 1 | a 1 | b 2 | aa 2 | bb 2 | cc 取得したい内容 id| name1| name2| | name3 1| a | b| 2| aa | bb | cc アクセスとエクセルのマクロを駆使していますが、うまくできません。

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

  • ベストアンサー
noname#231195
noname#231195
回答No.2

Name3まででいいんですか? 以下のやり方ではName5まで表示するようにしました。 もっとも、Query3において、Name1から5までと同様にして、いくらでも増やすことはできます。 また、前提条件として、同一IDには同一のNameが含まれないこととしています。 含まれたらどうなるか試していません。案外うまく走るかもしれませんが。 テーブルはTable1という名前で、ID(整数型)、Name(文字列型)というフィールドを含んでいます。 で、次の3つのクエリを作ると、Query4でお望みの結果が出ます。 Query2 SELECT Table1.ID, Table1.Name, DCount("*","Table1","ID<=" & [id] & " AND Name <='" & [Name] & "'") AS ID2 FROM Table1; Query3 SELECT Table1.ID, DLookUp("Name","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID])) AS Name1, DLookUp("ID2","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID])) AS ID2_1, DLookUp("Name","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_1])) AS Name2, DLookUp("ID2","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_1])) AS ID2_2, IIf(DCount("*","Query2","ID=" & [ID])>=3,DLookUp("Name","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_2])),"") AS Name3, IIf(DCount("*","Query2","ID=" & [ID])>=3,DLookUp("ID2","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_2]))) AS ID2_3, IIf(DCount("*","Query2","ID=" & [ID])>=4,DLookUp("Name","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_3])),"") AS Name4, IIf(DCount("*","Query2","ID=" & [ID])>=4,DLookUp("ID2","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_3])),"") AS ID2_4, IIf(DCount("*","Query2","ID=" & [ID])>=5,DLookUp("Name","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_4])),"") AS Name5, IIf(DCount("*","Query2","ID=" & [ID])>=5,DLookUp("ID2","Query2","ID=" & [ID] & " AND ID2=" & DMin("ID2","Query2","ID=" & [ID] & " AND ID2>" & [ID2_4])),"") AS ID2_5 FROM Table1 GROUP BY Table1.ID ORDER BY Table1.ID; Query4 SELECT Query3.ID, Query3.Name1, Query3.Name2, Query3.Name3, Query3.Name4, Query3.Name5 FROM Query3 ORDER BY Query3.ID;

marugori
質問者

補足

ありがとうございます。 アクセスやVBA系は初心者なのでDLookUp、DMin等勉強します。 クエリからクエリも呼び出せるのですで、勉強になります。

その他の回答 (2)

回答No.3

 私のやり方は《バカチョン方式》です。テーブル結合もSELECT文の複文も不要という《ド素人万歳》のやり方。で、先のクエリのSQLビューは次のようです。 【SQL】 SELECT DISTINCT   Test.ID,   CutStr(DBSelect("SELECT name FROM TEST WHERE ID=" & [ID] & " ORDER BY name"),";",1) AS name1,   CutStr(DBSelect("SELECT name FROM TEST WHERE ID=" & [ID] & " ORDER BY name"),";",2) AS name2,   CutSTR(DBSelect("SELECT name FROM TEST WHERE ID=" & [ID] & " ORDER BY name"),";",3) AS name3 FROM Test ORDER BY ID; 【説明】 ・DISTINCT区でSELECTする[Test.ID]の重複を省く。 ・ORDER BY IDで[Test.ID]を昇順に並べる。  以上が出来たらクエリは完成したも同然。 ? DBSelect("SELECT name FROM TEST WHERE ID=1 ORDER BY name") a;b ? DBSelect("SELECT name FROM TEST WHERE ID=2 ORDER BY name") aa;bb;cc と、SELECT文の実行結果を区切り子で連結した文字列として返す DBSelect()を組み込むだけ。で、その戻り値を ? CutStr("a;b",";",1) a ? CutStr("a;b",";",2) b と切り出して name1、name2 と命名するだけ。 なお、DBSelect()を用いれば添付図のように全てを区切り子で連結したテキストとして取得することも可。このテキストは、容易にエクセル文書として利用することができます。 【DBSelect】 Public Function DBSelect(ByVal strQuerySQL As String, _              Optional colDelimita As String = ";", _              Optional rowDelimita As String = ";") As String On Error GoTo Err_DBSelect   Dim R      As Integer ' 行インデックス   Dim N      As Integer ' 行総数 - 1   Dim cnn     As ADODB.Connection   Dim rst     As ADODB.Recordset   Dim fld     As ADODB.Field   Dim strList   As String ' 全てのデータを区切子で連結して格納      Set cnn = CurrentProject.Connection   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       N = .RecordCount - 1       .MoveFirst       For R = 0 To N         For Each fld In .Fields           With fld             strList = strList & .Value & colDelimita           End With         Next fld         strList = Mid(strList, 1, Len(strList) - 1) & rowDelimita         .MoveNext       Next R     Else       strList = ""     End If   End With Exit_DBSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DBSelect = IIf(Len(strList) > 0, Replace(strList & "[END]", rowDelimita & "[END]", ""), "")   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr(13) & Chr(13) & _       "・Err.Description=" & Err.Description & Chr(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function 【CutStr】 Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function

回答No.1

ウーン。70歳を迎えた爺にも出来るだろうか?なんて思ってチョビット挑戦してみたが・・・。幾つか疑問が 【疑問】一体、name1、・・・、name3の列数は固定なのだろうか? 仮に、nameのMAXに応じて変化するとなると、これはクエリでは無理そう。固定であれば、できるかも。

marugori
質問者

補足

ありがとうございます。 画像イメージの通りです。 name列はMAX3列で固定です。 name1、2までの場合NULLが入ります。

関連するQ&A