キーワードを1つにまとめたいです

こんにちは。下記のようなIDに対し、複数のキーワードが登録されています。

TABLE1
フィールド、ID、KW

ID,KW
001,ice
001,cold
001,tastegood
002,book
002,google
003,analytics
003,excite
003,yahoo
003,sql

といったようにデータが登録されています。
これだと見にくいのでクエリで下記のように整形したいと思います。

001 ice cold tastegood
002 book google
003 analytics excite yahoo sql

半角スペースで区切りたいと思います。MYSQL5.1かMS ACCESS2003で
やれればと思っています。よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

MySQLであれば、独自機能のGROUP_CONCAT関数で実装できると思います。



参考URL:http://dev.mysql.com/doc/refman/5.1/ja/group-by- …
    • good
    • 0
この回答へのお礼

うわ!!この関数凄いです!!知りませんでした!ご回答ありがとうございます!!

お礼日時:2011/04/20 09:18

以下、Accessでの方法です。



クエリで表示するならば、

http://www.f3.dion.ne.jp/~element/msaccess/AcTip …




テーブルに直接取り込むならば、

http://oshiete1.watch.impress.co.jp/qa6628827.html

の書き直しで、
TABLE1と同じ構造のTABLE2を設定し、
TABLE2: ID KW

以下のコードを標準モジュールに保存し、
ボタンクリックで呼び出すか、あるいは
ボタンクリックの中にプロシージャの
中身をコピーして実行してもいいです。

なお、DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。


Sub test()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim strSQL As String
Dim myStr1 As String
Dim myStr2 As String

strSQL = "SELECT TABLE1.ID FROM TABLE1 GROUP BY TABLE1.ID;"
Set db = CurrentDb
Set rs1 = db.OpenRecordset("TABLE1")
Set rs2 = db.OpenRecordset("TABLE2", dbOpenDynaset)
Set rs3 = db.OpenRecordset(strSQL)

If rs3.RecordCount > 0 Then
rs3.MoveFirst
Do Until rs3.EOF
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
If rs3!ID = rs1!ID Then
myStr1 = rs1!ID
myStr2 = myStr2 & " " & rs1!KW
End If
rs1.MoveNext
Loop
rs3.MoveNext
End If
rs2.AddNew
rs2!ID = myStr1
rs2!KW = myStr2
rs2.Update
myStr1 = ""
myStr2 = ""
Loop

End If
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
rs3.Close: Set rs3 = Nothing
db.Close: Set db = Nothing
End Sub
    • good
    • 0
この回答へのお礼

コードまで書いていただいてありがとうございます!なるほど、これならできそうですね!ご回答ありあとうございました!!ちなみに今回はmysqlのgroup_concat関数を使おうと思います。でも、勉強になります、助かりました!

お礼日時:2011/04/20 09:19

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessでグループ化した結果フィールドをつなげるには?

Accessでグループ化した結果フィールドをつなげるには?

Access2003で

区分/コード
A/123
A/456
A/789
B/234
B/567

というテーブルがあり、グループ化すると、区分Aのコードは123、456、789、
区分Bのコードは234、567と表示や印刷することはできます。
(たとえば、フォームやレポートのサブフォームなどに各コードを表示することはできます)

これを、
フィールド1/フィールド2
A/123456789
B/234567
というふうにコード部分を1つのフィールドにつなげることは可能でしょうか?

上記のように、区分Aのデータ件数は3件、区分Bは2件というように
コードのデータ件数はまちまちですが、それに対応してつなげたいと考えております。


よろしくお願いいたします。

Aベストアンサー

例えば、3項目あれば、クロス集計クエリを使って
A 123 1
A 456 2
A 789 3
B 234 1
B 567 2
となっているものを
0 1  2  3
A 123 456 789
B 234 567
にできます。
「0」「1」「2」「3」のフィールドが出来上がる。
出現数のカウントもできます。
工夫してこれが使えればこれが一番楽かと思います。

Q複数のレコードを1つのレコードにまとめる方法

いつもお世話になりますm(__)m

Access2003で、以下のテーブルがあるとします。

例)tableA

項目1|項目2
---------
部署1|あいうえお
部署2|かきくけこ
部署1|さしすせそ
部署1|たちつてと
部署2|なにぬねの

上記のテーブルの項目1が同じものを、別テーブルの1つのフィールドにスペースでまとめたいと思っています。

例)結果テーブル

項目1|項目3
---------
部署1|あいうえお さしすせそ たちつてと
部署2|かきくけこ なにぬねの


可能であればクエリで処理したいのですが、無理でしたらVBA他でも結構です。

お詳しい方、ご教授のほど宜しくお願い致しますm(__)m

Aベストアンサー

見るだけなら、
TRANSFORM First(項目2) AS 値
SELECT 項目1 FROM
(SELECT tableA.項目1, tableA.項目2, Count(*) AS Temp番号
FROM tableA INNER JOIN tableA AS TT ON (tableA.項目2 >= TT.項目2) AND (tableA.項目1 = TT.項目1)
GROUP BY tableA.項目1, tableA.項目2) AS WW
GROUP BY 項目1 PIVOT "項目2" & "-" Temp番号;


このクエリからデータを抜き取ってもいいのですが、
方法はそれこそいろいろですが。ベタにレコードセットから。
NoMatchプロパティを利用してもいいのですが、
思いっきりループの入れ子で。

(1)
以下を標準モジュールに貼り付けます。
DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。
このとき、
Microsoft ActiveX Data Objects xx Library
にチェックが入っていたらはずしてください。

Sub test()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim strSQL As String
Dim myStr1 As String
Dim myStr2 As String

strSQL = "SELECT tableA.項目1 FROM tableA GROUP BY tableA.項目1;"
Set db = CurrentDb
Set rs1 = db.OpenRecordset("tableA")
Set rs2 = db.OpenRecordset("結果テーブル", dbOpenDynaset)
Set rs3 = db.OpenRecordset(strSQL)

If rs3.RecordCount > 0 Then
rs3.MoveFirst
Do Until rs3.EOF
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
If rs3!項目1 = rs1!項目1 Then
myStr1 = rs1!項目1
myStr2 = myStr2 & " " & rs1!項目2
End If
rs1.MoveNext
Loop
rs3.MoveNext
End If
rs2.AddNew
rs2!項目1 = myStr1
rs2!項目2 = myStr2
rs2.Update
myStr1 = ""
myStr2 = ""
Loop

End If
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
rs3.Close: Set rs3 = Nothing
db.Close: Set db = Nothing
End Sub

(2)
フォームにコマンドボタンを設定し、そのクリックイベントで

Private Sub コマンド0_Click()
Call test
End Sub

以上です。

見るだけなら、
TRANSFORM First(項目2) AS 値
SELECT 項目1 FROM
(SELECT tableA.項目1, tableA.項目2, Count(*) AS Temp番号
FROM tableA INNER JOIN tableA AS TT ON (tableA.項目2 >= TT.項目2) AND (tableA.項目1 = TT.項目1)
GROUP BY tableA.項目1, tableA.項目2) AS WW
GROUP BY 項目1 PIVOT "項目2" & "-" Temp番号;


このクエリからデータを抜き取ってもいいのですが、
方法はそれこそいろいろですが。ベタにレコードセットから。
NoMatchプロパティを利用してもいいのですが、
思いっきりループの入れ...続きを読む

QAccess:クエリーにて集計後に文字列結合したい。

Accessのクエリーでレコードのグループ化を行っている状態で、あるフィールドに対してだけ文字列の結合を行いたいのですが、集計部分をどのように指定すればよいかわからず困っています。

イメージとしては、SQLビューにて、グループ化されたレコードの合計が、
 SUM([テーブル名].[フィールド名])
で求められる様に、
エクセルの文字列結合関数
 CONCATENATE([テーブル名].[フィールド名])
が使いたい、という感じです、、

Accessにおける文字列結合は"&"を使うとありましたが、この場合どのように記述するべきでしょうか?

Aベストアンサー

Excelでの「同一行の各列のテキストデータを連結」と同様の操作であれば、No.1の方が答えられている方法でできます。

例)
ID GrNo テキスト1 テキスト2 テキスト3
1  1 テスト1   テスト2  テスト3
2  1 テスト4   テスト5  テスト6

→GrNoでグループ化して集計を掛ける際、
 「[テキスト1] & [テキスト2] & [テキスト3]」の式をフィールドとして指定すれば
  ID=1では「テスト1テスト2テスト3」が返される。


ただ、もし「同一列の各行のテキストデータを連結」を想定されているのだとすると、これはAccessに備え付けの関数では対処できません。
・・・もしかしたら私が知らないだけかもしれませんが(汗)

例)
ID GrNo テキスト
1  1   テスト1
2  1   テスト2
3  1   テスト3
4  2   テスト4
5  2   テスト5

→GrNoでグループ化して集計をかけた場合に、
  GrNo=1で「テスト1テスト2テスト3」を返す式は用意されていない。
  (あるのは「First(先頭)」などの1レコードのデータを参照する式か、
   「SUM」などの数値の演算結果を表示させる式のみ)


なので、どうしても下側の例のようなデータを作成したいということでしたら、
一旦フォームなどで同GrNoのレコードを表示させた上で、そのフォームを
順次レコード移動しながら「テキスト」フィールドを連結させ、
それをGrNoとセットにして別のテーブルに保存、
といった回りくどいことをするぐらいしか、今のところ思いつきません。

Excelでの「同一行の各列のテキストデータを連結」と同様の操作であれば、No.1の方が答えられている方法でできます。

例)
ID GrNo テキスト1 テキスト2 テキスト3
1  1 テスト1   テスト2  テスト3
2  1 テスト4   テスト5  テスト6

→GrNoでグループ化して集計を掛ける際、
 「[テキスト1] & [テキスト2] & [テキスト3]」の式をフィールドとして指定すれば
  ID=1では「テスト1テスト2テスト3」が返される。


ただ、もし「同一列の各行のテキストデータを連結」を想定されて...続きを読む

Qアクセスで複数のレコード情報を1レコードにまとめる方法 

アクセスにおいて
例えば以下のような1~6までのレコードを

1.Aさん,犬
2.Aさん,猫
3.Bさん,犬
4.Bさん,鳥
5.Bさん,豚
6.cさん,牛



1.A,犬,猫
2.B,犬,鳥,豚
3.C,牛

このように、この場合だったら、~さんを軸に、
ひとつのレコードとしてまとめることは可能でしょうか。

仕事で使いたいのですが、やり方がわからず非常に困っています。
お手数ですがご教示いただけると幸いです。

よろしくお願いいたします。

Aベストアンサー

通常のクエリーだけでは無理です

このテーブルをTBL(名前,ペット)とすると

モジュールに
Public Function PetNameAdd(pName) As String
Dim iRS As Recordset
Dim strSQL As String
Dim strRet As String

strRet = ""
strSQL = "SELECT ペット FROM TBL WHERE 名前 = '" & pName & "'"
Set iRS = CurrentDb.OpenRecordset(strSQL)

While iRS.EOF = False
If strRet = "" Then
strRet = iRS(0)
Else
strRet = strRet & "," & iRS(0)
End If
iRS.MoveNext
Wend

iRS.Close
Set iRS = Nothing
PetNameAdd = strRet
End Function

を登録しておいてクエリーで
SELECT 名前, PetNameAdd(名前) AS 全ペット
FROM (SELECT DISTINCT 名前 FROM TBL)

と書けば近いものは出来ます
しかしながらクエリーは頻繁に関数を呼び出すのであまりお勧めは出来ません

一度、全ペット用のテーブルをこの関数を利用して作り、後の操作をする方がマシンに対する負荷は少ないです

通常のクエリーだけでは無理です

このテーブルをTBL(名前,ペット)とすると

モジュールに
Public Function PetNameAdd(pName) As String
Dim iRS As Recordset
Dim strSQL As String
Dim strRet As String

strRet = ""
strSQL = "SELECT ペット FROM TBL WHERE 名前 = '" & pName & "'"
Set iRS = CurrentDb.OpenRecordset(strSQL)

While iRS.EOF = False
If strRet = "" Then
strRet = iRS(0)
Else
strRet = strRet & "...続きを読む

QACCESS 一つのフィールドに複数レコードの値をセットしたい

どなたか教えて下さい。

Aテーブルに、(1)コード (2)No というフィールドがあります。
例)
(1)   (2)
1111  1
1112  2
1113  3
1111  4
この内容を、別テーブルに、
(1)コード (2)
1111   1,4
1112 2
1113 3
と、同一コードであれば、(2)フィールドにカンマ付きで全て
表示したいのです。

どなたか、お知恵をお貸し下さい。
よろしくおねがいいたします。

Aベストアンサー

データベース関数などと命名した標準モジュールに以下の関数をコピペして保存して下さい。
次に、イミディエイトウインドウでテストして頂ければ幸いです。

[イミディエイト]
? DBSelect("SELECT F2 FROM A WHERE F1=1111")
1;4
? DBSelect("SELECT F2 FROM A WHERE F1=1111", " And ")
1 And 4 And

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integer
  Dim J   As Integer
  Dim R   As Integer
  Dim C   As Integer
  Dim M   As Integer
  Dim N   As Integer
  Dim rst  As ADODB.Recordset
  Dim fld  As ADODB.Field
  Dim Datas As String
  
  Set rst = New ADODB.Recordset
  ' =================
  ' Begin With: rst
  ' -----------------
  With rst
     .Open strQuerySQL, _
        CurrentProject.Connection, _
        adOpenStatic, _
        adLockReadOnly
     If Not .BOF Then
      M = .RecordCount - 1
      N = .Fields.Count - 1
      .MoveFirst
      For R = 0 To M
        For C = 0 To N
          Datas = Datas & .Fields(C) & strSeparator
        Next C
        .MoveNext
      Next R
     End If
  End With
  ' ---------------
  ' End With: rst
  ' ===============
Exit_DBSelect:
  DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))
  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

データベース関数などと命名した標準モジュールに以下の関数をコピペして保存して下さい。
次に、イミディエイトウインドウでテストして頂ければ幸いです。

[イミディエイト]
? DBSelect("SELECT F2 FROM A WHERE F1=1111")
1;4
? DBSelect("SELECT F2 FROM A WHERE F1=1111", " And ")
1 And 4 And

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integ...続きを読む

Qアクセス:SQLでフィールドの結合できますか

例でいいますと、
テーブル:Table_Aには
フィールド:a1,a2,a3、があります
ここで、bbというフィールドで、内容はa1+a2のものを得たいのですが

Table_Aには、a1、a2、a3、が定義されていますが、bb、は定義されていません

事情は他の人が作ったもので、それに合わせる必要があるためです

別件ですが、bb、というフィールド名でa1、を使いたい時は
select a1,a2,a3,a1 as bb from Table_A;
と、書くことを教えてもらいました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2295714

今回はa1とa2が結合したものが、bbというフィールドで使いたいことです

SQLではそんなことできません、という回答でもいいので
よろしくお願いします

Aベストアンサー

ほいよ。

select a1,a2,a3,[a1]&[a2]as[bb] from Table_A;

こんなもんかな。

参考までに。。。

>>SQLではそんなことできません、という回答でもいいので
SQLもいろいろと種類があるので全てがこれで~というわけでもないです。はい。
他にも、OraclSQLやSQLServerやMySQLなど、いろいろあります。
自分は、SQLServerでお勉強中ですが。。。

それぞれ記述がかなり違ってきたりもするので、もしも、Access以外のデータベースソフトを使う機会があったらその都度調べながら進めることになると思います。
まぁ、基本は同じですけどね。若干違ってくるので。。。

何はともあれ、がんばってくださいな。

参考URL:http://ag5.net/~nino/access-32.html

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

Qキーが同じを複数行を1行にまとめるには?

こんばんは。質問です!
例えば、
テーブルを結合して、以下の様な結果が返ってくるとして、
製品コード  取扱店
-------------------------
001      あああ
001      いいい
001      ううう

これを
製品コード  店1    店2     店3
----------------------------------------------
001      あああ    いいい   ううう

と1レコードにするにはどうしたら、いいでしょうか??

困っています。お願い致します!

Aベストアンサー

横に展開する最大数を固定する必要があるけど・・

select 製品コード,max(decode(r,1,取扱店)) 店1,max(decode(r,2,取扱店)) 店2,max(decode(r,3,取扱店)) 店3
from (select x.*,row_number() over(partition by 製品コード order by 取扱店) r from TARGET x)
group by 製品コード
;

な感じ。

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です


人気Q&Aランキング

おすすめ情報