こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

アクセスとエクセルのマクロを駆使していますが、うまくできません。

投稿日時 - 2017-07-11 20:29:22

QNo.9350845

すぐに回答ほしいです

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

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;

投稿日時 - 2017-07-12 02:59:46

補足

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

投稿日時 - 2017-07-12 09:03:25

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2017-07-12 09:49:35

ANo.1

ウーン。70歳を迎えた爺にも出来るだろうか?なんて思ってチョビット挑戦してみたが・・・。幾つか疑問が

【疑問】一体、name1、・・・、name3の列数は固定なのだろうか?

仮に、nameのMAXに応じて変化するとなると、これはクエリでは無理そう。固定であれば、できるかも。

投稿日時 - 2017-07-11 22:08:34

補足

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

投稿日時 - 2017-07-12 08:48:02

あなたにオススメの質問