• ベストアンサー

MySQLのGROUP_CONCATを実現する方法

こんにちは。 T-SQLでMySQLのGROUP_CONCAT関数と同等の結果を出力する方法を探しています。 やりたいことは、 テーブル"T_A"の項目にカラム"C1"、"C2"があると仮定します。 テーブル"T_A"にはデータが以下のように登録されています。 C1|C2| ------ A1|YY| A1|XX| カラムC2のYY、XXの値を文字列連結"YY/XX"として、1レコードで表示したいです。 C1|C2 | --------- A1|YY/XX| ご存知の方がいらしたら、お教え願います。

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

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

これでしょうか? SELECT G.GROUP_ID, G.GROUP_NAME, stuff( ( select cast(',' as varchar(max)) + U.USERNAME from USER_GROUPS U WHERE U.GROUP_ID = G.GROUP_ID order by U.USERNAME for xml path('') ), 1, 1, '') AS USERS FROM GROUPS G ORDER BY G.GROUP_NAME ASC; http://social.msdn.microsoft.com/Forums/sqlserver/en-US/f09d4166-2030-41fe-b86e-392fbc94db53/tsql-equivalent-for-groupconcat-function?forum=transactsql

関連するQ&A

  • GROUP_CONCAT✕複数列で、違うレコード数

    MySQLで、「GROUP_CONCAT」を「複数列」に適用させ、それぞれ異なるレコードを1つにまとめようとしたのですが、 取得出来る結果が、多い方の数に引き連られてしまいます。 ざっくりとした質問でアレなのですが、これは結合の仕方が悪い、 と推測されるでしょうか? そもそも「GROUP_CONCAT」を複数列に適用させる場合、それぞれ異なるレコード数をまとまることはできるのでしょうか?。 ■期待した取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows [テーブルBカラムf] => man ■実際の取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows,windows [テーブルBカラムf] => man,man 「テーブルB」の取得結果が、「テーブルA」取得結果数に引き連られてしまいます ■SQL(抜粋) SELECT  GROUP_CONCAT(a.c) AS c,  GROUP_CONCAT(a.d) AS d,  GROUP_CONCAT(b.e) AS e,  GROUP_CONCAT(b.f) AS f FROM hoge h LEFT JOIN テーブルA a ON (h.id = a.hoge_id) LEFT JOIN テーブルB b ON (h.id = b.hoge_id)

  • sql serverでgroup concat

    SQL SERVERを使用してGROUP CONCATと同等の結果を取得したいと考えています。 以下のcolumn1のテーブル名の値を条件を指定して、カンマ区切りの文字列で取得したいです。 column1 ----------- test1 test2 test3 求める出力結果 test1,test2,test3 調べたところ下記のように行うと近い結果を得ることができました。 SELECT my_column AS [text()] FROM my_table FOR XML PATH('') しかしこれだと区切り文字が指定できません。 カンマ区切りに指定をするにはどうすればよいでしょうか? よろしくお願いします。

  • group_concatを複数列に設定する

    こんにちは group_concatを複数列に設定すると、グルーピングした結果が1行に繰り返し表示されてしまいます。 どのように解決すればよろしいのでしょうか? 例)カラムCOL1が主キーのテーブル MAIN_TABLE ----------- COL1| AAAA| SUB_TABLE1 ----------- COL1|VALUE AAAA|111111 AAAA|222222 SUB_TABLE2 ----------- COL1|VALUE AAAA|xxxxxxx AAAA|yyyyyy 上記のテーブルを下記のSQLで連結 SELECT M..COL1 ,group_concat(S1.VALUE,'/') AS GS1 ,group_concat(S2.VALUE,'/') AS GS2 FROM MAIN_TABLE AS M LEFT OUTER JOIN SUB_TABLE1 AS S1 ON M.COL1=S1.COL1 LEFT OUTER JOIN SUB_TABLE2 AS S2 ON M.COL1=S2.COL1 GROUP BY M.COL1 抽出結果が COL1|GS1 | GS2 ------------------------------------------------------------- AAAA|111111/222222/111111/222222|xxxxxxx/yyyyyy/xxxxxxx/yyyyyy と表示されてしまいます。カラムGS1とCS2に表示されているグループの繰り返しを削除し、 抽出結果を COL1|GS1 | GS2 --------------------------------- AAAA|111111/222222|xxxxxxx/yyyyyy にするにはどうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • MYSQLでgroup by を教えてください。

    まだ初心者なんです。よろしくお願いいたします。 テーブル$tbl_nameに日付date コラムに (2009-11-3 14:25:06).(2009-11-3 11:25:06). (2009-11-5 12:25:06).(... ....と年齢 ageコラムに (18)(19)(20)... 性別コラムage に (danshi)(jyoshi) が入っています。 これを日付別 に内容が存在するだけ出力したいのです。 出力内容は(18)→25、(19)→13、(20)→7、の数だけ、 同様に(danshi)→20、(jyoshi)→25、というように 〇月〇日18才は25人、19才は13人、20才は7人、 男子は20人、女子は25人と出したいのです。 $sql = "SELECT 'age',count(age) FROM $tbl_name group by 'date'"; $result = mysql_query($sql, $db) or die("クエリの送信に失敗しました。<br />SQL:".$sql); while ($row = mysql_fetch_assoc($result)){ $age .=$row;} 等記入しているのですが、何とも動きませんのです。 どうしたらよろしいものでしょう。よろしくお願いいたします。

  • GROUP_CONCATで条件指定

    | ID | name | weight | height | | 1 | 佐藤 | 80 | 160 | | 2 | 太郎 | 90 | 160 | というテーブルから 佐藤と太郎の身長と体重 体重 佐藤:80Kg / 太郎:90Kg 身長 160cm というようにブラウザで表示したいのですが、 どのようにすればよいかわかりません。 現在はphpで $sql .= " SELECT "; $sql .= " GROUP_CONCAT(CONCAT(name, ':', weight, 'kg') SEPARATOR '/') AS weight "; $sql .= " GROUP_CONCAT(CONCAT(name, ':', height, 'cm') SEPARATOR '/') AS height "; $sql .= " FROM "; $sql .= " ex_table "; $rs = mysql_query($sql, $conn); $box =<<<EOM <table> <tr> <td cowspan="2"> 佐藤と太郎の身長と体重 </td> </tr> EOM; while($rec = mysql_fetch_array($rs)){ $box .= "<tr> "; $box .= "<td>体重</td>"; $box .= "<td>{$rec['weight']}</td>"; $box .= "</tr>"; $box .= "<tr> "; $box .= "<td>身長</td>"; $box .= "<td>{$rec['height']}</td>"; $box .= "<tr>"; } $box .= "</table>"; としていますが、これだと 佐藤と太郎の身長と体重 体重 佐藤:80Kg / 太郎:90Kg 身長 佐藤:160cm / 太郎:160cm となります。 同じ値のものは、そのまま数値だけを表示したいのですが、 SQL文で何かうまくする方法はないでしょうか。

    • ベストアンサー
    • MySQL
  • sql連結演算子concatと"||"

    mysqlにて、"||" を連結演算子として使いたいと思います。 my.iniのsql-modeに"PIPES_AS_CONCAT"をカンマ区切りで追加しました。 しかし、結果として反映してくれませんでした。 最終的にjavaからアクセスしたいので、my.ini内で設定したほうが確実だと思ったのですが…。 "||" と同意のconcatも試してみましたが、 連結する文字列が多いせいか(10個くらいです)エラーになることと、 sqlのcase文とあわせて使うことができなかったので悩んでいます。 いい方法があればご教授ください、お願いします。

  • SQLで違うテーブルの集計結果を比較することは可能でしょうか?

    SQLで違うテーブルの集計結果を比較することは可能でしょうか? 例えばAテーブルがこんな感じです A1_ A2_ A3___ A4 ____A5 XX_ YY _5 __2010/8/13 _10:00:59 Bテーブルはこんな感じです。 B1_ B2_ B3___ B4 ____B5 XX_ YY_ 米 __2008/5/20_ 00:00:00 XX_ YY_ 味噌 _2009/8/22_ 01:02:33 XX_ YY_ 卵__ 2007/8/21_ 23:35:55 XX_ YY_ 醤油 _2010/7/16_ 15:30:35 XX_ YY_ 胡麻_ 2010/8/13_ 02:02:02 です。 見つけたい条件はBテーブルに指定した日付が含まれてる(例えば今日8/13だとか)レコードがあればそのXXとYYが何件あるかカウントをしてその値がAテーブルのA3の値と同一か調べたいのですがこういうことは出来ますでしょうか? SQL Server2005です

  • このような場合のSQLの記述

    下記のSQLの記述方法について教えてください。 TBL:smp A  B  C ------------ XX あ 5 YY え 3 ZZ お 2 XX え 1 のテーブルで、Aの列でグループ化し、Cの列の最大の行を出力したい。 アウトプットとしては、 A  B  C ------------ XX あ 5 YY え 3 ZZ お 2 にしたいのですが、A、Bでグループ化すると、上記のアウトプットにはならず、 Aだけでグループ化すると、Bの列が表示されない。 どうしたらいいでしょうか?

  • 複数フィールドのカウント

    下記のようなテーブルで下記の結果を得られる SQL文を押していただけばと思います。 Micorosoft SQL Serverの予定です。 テーブル1 XX YY -------------------------- 商品a 商品d 商品b 商品a 商品c 得たい結果 商品a 2 商品b 1 商品c 1 商品d 1 UNIONでくっつけようと いろいろ考えて下記のようにしてみたいのですが SELECT XX,count(XX) FROM テーブル1 GROUP BY XX UNION SELECT YY,count(YY) FROM テーブル1 GROUP BY YY 下記の結果がえてしまい 商品a の結果を合計したです。 商品a 1 商品a 1 商品b 1 商品c 1 商品d 1 XX,YYを一括で集計(COUNT)できる方法やUNIONなどで別のフィールドにある同じ値を合計できる方法などもありましたらよろしくお願いします。

  • MySQL5でキーがないテーブルの結合はできますか?

    MySQL5なのでサブクエリが使えるのですが、 A x Bのレコードを返したいのですがSQLで可能でしょうか? ■テーブルA a_id b_id 1 1 1 2 ■テーブルB c_id 1 2 ■期待する結果 a_id b_id c_id 1 1 1 1 2 2

    • ベストアンサー
    • MySQL