- ベストアンサー
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 アクセスとエクセルのマクロを駆使していますが、うまくできません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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;
その他の回答 (2)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
私のやり方は《バカチョン方式》です。テーブル結合も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
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足
ありがとうございます。 アクセスやVBA系は初心者なのでDLookUp、DMin等勉強します。 クエリからクエリも呼び出せるのですで、勉強になります。