• ベストアンサー

行の結合?

こんにちは。 SQLについて質問です。 id  name  goal 1  山田  東京 2  木下  北海道 3  高橋  大阪 3  高橋  沖縄 こういう状態でデータが入っていたとして、 idが3の高橋はgoalが違う状態で2件データがあります。 これを、 id  name  goal 1  山田  東京 2  木下  北海道 3  高橋  大阪、沖縄 こうなるようにしたいのですが、 どうSELECT文を書けばよいでしょうか? よろしくお願いします。  

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

  • ベストアンサー
回答No.1

こんなことすると出来るっぽいですよ。 select id, name, array_to_string (array(select b.goal from tbl b where b.id = a.id order by b.goal), '、') as strAgg from tbl a group by a.id http://www.geocities.jp/oraclesqlpuzzle/postgresql/postgresql-memo.html

関連するQ&A

  • テーブル結合について

    SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • 日付型(時刻含む)を抽出条件にして行を抽出したい。

    はじめまして、よろしくお願いします。 現在SQLサーバー2000を使用してこの処理を行おうと思っております。 一度テーブルに格納したデータをSELECT文を使って抽出したい と思っているのですが、WHERE条件に日付型のフィールドを指定するとうまく行きません。(時刻が日付型のフィールドに入っている場合、うまくいきません。) やっていることは YMD(DATE型・主キー)、ID(VERCHAR型・主キー)、NAME(VERCHAR型) というのテーブル(テーブル名:MEIBO)に入っている 2002/02/02 14:10:55、0001、山田 太郎 というデータを 取込年月日、個人IDを指定して特定の列を取り出そうとしています。 SQL文は SELECT * FROM MEIBO WHERE YMD = '2002/02/02 14:10:55' AND ID = "0001' と記述していますが、一件もヒットしません。 DATE型のフィールドにはINSERTするときにGETDATE()をつかってシステム日付を 格納するようにしています。 GETDATE()ではなく、DATE()を使ってシステム日付を格納した 2002/02/02、0001、山田 太郎 という時刻の入っていないデータに対しては SELECT * FROM MEIBO WHERE YMD = '2002/02/02' AND ID = "0001' というSQL文でヒットするのですようです。 時刻が入ったらそのフィールドを抽出条件として使うことは無理なのでしょうか? 基本的な部分で勘違いしているのかもしれませんが なにかお気づきの点がありましたら、ご教授ください。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • 無視されるdistinct

    お世話になります  大規模商談をまとめた営業のリストを作るSQLを書こうとしています。   営業部員テーブル (test.person) id | name ----+------ 1 | 山田 2 | 高橋 3 | 田中 商談テーブル (test.deal) id | person_id | customer | amount ----+-----------+----------+-------- 1 | 1 | XX商事 | 20000 2 | 3 | BB電機 | 10000 3 | 2 | ZZ不動産 | 2000 4 | 1 | RR証券 | 8000 期待している検索結果 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 高橋 | 2000 | ZZ不動産 下記のようなSQLを書きました。 select distinct name,amount,customer from test.deal,test.person where person.id=deal.person_id order by amount desc  しかし、nameをdistinctしているにもかかわらず、結果は下記の通り、「山田」が重複しています。 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 山田 | 8000 | RR証券 高橋 | 2000 | ZZ不動産 いろいろと調べて、group by を使えばいい、というようなやり方を示している例も多かったのですが、それもうまくいきません。(必要であれば載せます) 期待通りの結果を得るにはどのようなSQLを書けばよろしいでしょうか。 よろしくお願いいたします。

  • 並び替えた後の表の結合

    並び替えた後の表を結合したいと思っています。 UNIONを使うと、結合後でソートしてしまうので、これを回避したいです。 1つ目のSQL  SELECT ID, NAME FROM A_TABLE WHERE F1 = '10' ORDER BY F2,F3 2つ目のSQL  SELECT ID, NAME FROM A_TABLE WHERE F1 = '5' ORDER BY F3,F4 上記の2つの結果を1つにまとめて取得したいのです。 取得順は、1つめのSQLでF2,F3で並び替えられたデータの後、 2つめのSQLでF3,F4で並び替えられたデータにしたいです。 どうか良い方法を教えてください。

  • 抽出したデータの結合

    困ってる点があります。 抽出したフィールドの文字列を結合させるにはどうしたら良いでしょうか。 例) studentテーブルに「id」「name」という二つのカラムがあるとします。 抽出したidとnameをスラッシュ(/)を挟んで結合したいです。 select id,name from student →このSQLを実行すると 「001,相沢」が出力されるとすると 「001/相沢」となるように抽出したいと思っております。 SQLが初心者なものでどなたか教えてください。 よろしくお願いいたします。

  • 結合するデータがないとき!?

    select t1.id,t2.name from t1 inner join t2 t1.value=t2=id; t1 id|value ------- 1 | 0 2 | 1 t2 id|name ------- 1 | A 2 | B result id | name --------- 1 | 0 2 | A という結果を示したいのですが、t1.id が 0だとt2に該当する値がないので 2 | A としか帰ってきません。 select t1.id,t2.name from t1,t2 where t1.value=t2=id; としても同じ結果でした。求めるような結果を出すにはどういったSQLを発行すればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • MySQL SELECT WHERE 条件 大量

    mysqlのSELECT文でWHEREを使い条件を指定する時、指定する条件が数十件~数百件合った場合どうすればよいのでしょうか? 例えば、 以下のような感じで名前カラムと住所カラムがあったとします name  address 田中  東京都 鈴木  大阪府 佐藤  北海道 加藤  沖縄県 中村  群馬県 小林  岐阜県 高橋  東京都 渡辺  大阪府 伊藤  北海道 山本  沖縄県 斎藤  群馬県 阿部  岐阜県     ・     ・     ・ そこで、東京都と大阪府と北海道の人だけをSELECT文で選択したいのですが、 WHERE `address` = '東京都' OR `address` = '大阪府' OR `address` = '北海道' というように、一つづつ記述していかなければならないのでしょうか? この例の場合だと3件だけの指定ですが、もしもっと膨大な量を指定したいとなったとき、とても効率が悪いように思います。 なにか良い方法はないのでしょうか? ちなみにPHPからMySQLを利用しているのですが、現在 $where = array(); foreach($address as $value){ $where[] = "`address` = '${value}'"; } $where = implode(' OR ', $where); としておいて、 mysql_query("SELECT * FROM table WHERE ${where}"); とする方法しか思いつきません。 もっとスマートな方法があれば教えて下さい。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合した際、3行で返ってくるべき結果を一行で返す方法

    結合した2つのテーブルから県名と市町村名を取り出すため、下記のSQL文を書いてるのですが、結果が三行になって返ってきます。 当然の結果なのですが、これを一行にして返すことは可能でしょうか? ご存じの方いらっしゃいましたらお力添え頂ければと思います。 宜しくお願い致します。 SELECT pref.pref_name,city.city_name from pref left join city on pref.id = city.pref_id where pref.id = '1' 現状の結果 東京 港区 東京 葛飾区 東京 世田谷区 理想の結果 東京 港区,葛飾区,世田谷区 prefテーブル(都道府県) +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | pref_name | varchar(255) | YES | | NULL | | +-------------+--------------+------+-----+---------+----------------+ cityテーブル(市町村) +---------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | pref_id | int(11) | YES | | NULL | | | city_name | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+----------------+ +----+--------------+ | id | pref_name | +----+--------------+ | 1 | 東京都 | | 2 | 千葉県 | | 3 | 埼玉県 | +----+--------------+ +----+---------------+--------------+ | id | prefecture_id | city_name | +----+---------------+--------------+ | 1 | 1 | 港区 | | 2 | 1 | 葛飾区 | | 3 | 1 | 世田谷区 | | 4 | 2 | 船橋市 | | 5 | 2 | 我孫子市 | | 6 | 3 | 草加市 | | 7 | 3 | 和光市 | +----+---------------+--------------+

    • ベストアンサー
    • MySQL