• 締切済み

検索対象のデータが「複数レコード」を「1レコード」として獲得するSQL

教えて下さい。 SQLの理解が乏しく、難航しています。 検索対象のデータが複数レコード存在するのですが、 それぞれのレコードの特定の項目を区切り文字で区切 ったデータとして1レコードとして獲得するSQLがあ ればと思いました。 イメージ) テーブルA ID shapeID name 1 1 交通安全 1 2 防火管理 2 1 什器 3 1 セキュリティー 区切り文字","とし、IDを1で検索した表示結果 交通安全,防火管理 教えてgooで調べてみると、「縦方向のデータを横方向 にするのは、SQLは苦手」とありました。 やはり無理なのでしょうか? 宜しくお願いします。

みんなの回答

回答No.2

>「縦方向のデータを横方向にするのは、SQLは苦手」とありました。 >やはり無理なのでしょうか? 横展開自体は不可能ではありません。(条件が付くけど) select ID, max(decode(shapeID,1,name)) name1, max(decode(shapeID,2,name)) name2, max(decode(shapeID,3,name)) name3 from A group by ID とか select ID, max(decode(R,1,name)) name1, max(decode(R,2,name)) name2, max(decode(R,3,name)) name3 from (select A.*,row_number() over(partition by ID order by shapeID) R from A) group by ID で、横への展開は可能ですが・・ カラム数が固定になるので、予め最大数が判ってないと対応できません。 カンマで1カラムに統合するには、そのような集計関数を作るか、 再帰検索でこねくると出来ないことはありません。 そのような用件が多いのであれば、集計関数を自作すると良いと思います。 (集計関数の自作は、9i以降の機能です)

asaichi
質問者

お礼

有難うございます。 >カラム数が固定になるので… 固定なら可能ですよね~ でも、今後このような場合は参考になるのでありがたいです。 >9i以降の機能です 対象のDBが8iでしたので、カラム数が固定でもNGでした。 色々有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

ID + shapeIDでユニークになるのですか? プログラムを組んで、変数で受け取り、加工した方が 簡単だと思いますが?

asaichi
質問者

お礼

有難うございます。 >ID + shapeIDでユニークになるのですか? 確かにユニークになるのですが、データとして 1レコードで獲得したかったので… プログラムでの対応を検討してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【SQL】1つのレコード内にある複数のデータの集計

    1つのテーブルの1つのレコード内に、以下のような複数のBooleanデータがあって、trueがいくつあるかを数えたいのですが、1つのSQLで記述できるでしょうか? ID data1 data2 data3 data4 ... 1  true  false  true  false ...

  • SQLで1つのレコードから複数行挿入するには

    下記のようなレコードがあります。 node_id_1 node_nm_1 node_id_2 node_nm_2 ------------------------------------- 00001   AAAA    00002   BBBB 00003   CCCC    00004   DDDD このレコードを元に下記のようなデータを別テーブルに挿入したいのですが、SQLで可能でしょうか id node_id node_nm ----------------- 1  00001  AAAA 1  00002  BBBB 2  00003  CCCC 2  00004  DDDD idはシーケンスで取得します。そして、同一レコードだったものには同じidを振ります。 DBはPostgreSQL 8.4です。

  • SQLでのデータ検索方法

    以下のようにデータが格納されている テーブルAがすでにあります。  id  in_time  out_time  1         11:10  1   10:30  1         10:15  3   09:50  1   09:30  1         09:00  1   08:30  2         08:10  1         07:50  2   07:40  1   07:30 ここでin_timeとout_timeの範囲が指定されたとき 範囲内でidごとにin_timeとout_timeがセットにな っているデータのみ抽出したいのです。 例えば in_time:7:00~10:20 out_time:8:00~11:30 と指定されたとき、検索結果を  id  in_time  out_time  1         10:15  1   09:30  1         09:00  1   08:30  2         08:10  2   07:40 と表示したいのです。 プログラムで1レコードずつ処理するしかない と思っているのですが、SQLで上記のような結果 を取得する方法はあるのでしょうか。 環境は、 RHEL 5 postgesql 8.1.9 です。

  • SQLでレコードの抽出

    MySQLです。 商品IDと販売先、管理番号が、判明しているとき、 最大商品IDとそのレコードを取得するには、 どのようなSQLを書けば、よろしいでしょうか? select *, ? from SYOUHIN WHERE ???? テーブル例) ↓ユニーク 商品ID 販売先 管理番号  販売日 1   A社   1     2015-07-10 2   A社   2     2015-07-12 3   B社   1     2015-06-30 4   B社   2     2015-07-06 5   C社   1     2015-04-21

    • ベストアンサー
    • MySQL
  • もっとも新しいレコードから検索する方法

    MySQLにデータを登録しており、PHPにてWebサイトにデータを表示しています。SQLはSELECT * FROM TABLE WHERE .... なんですが、この場合一番初めのレコードから順に表示されてしまうため、古いデータがはじめに、新しいデータが最後尾に表示されてしまいます。 これを解消するため最後尾のレコードから検索するにはどうしたらよいのでしょうか?又、カテゴリが異なってしまいますが、PHPでもっとよい方法などございましたらお願いします。

    • ベストアンサー
    • MySQL
  • SQL:複数行のデータを一つの文字列にまとめたい

    複数行のデータを一つの文字列にまとめる方法を教えてください。 ※環境SQLServer2005 例: ID DATA AA XXX BB YYY AA ZZZ 次のようなテーブルがあるとき、IDがAAであるものを一つの文字列 "XXXZZZ" にまとめたデータにSQLで加工したいです。

  • コンボボックス検索で複数データを検索できない

    「現状の困りごと」 コンボボックスで該当するデータを全て検索したいのですが、検索先の「キー(文言)」が複数レコードで存在する場合、最初に検索「表示レコード」したデータ以外は検索できなくて困っています。 「やりたいこと」 コンボボックス検索で検索先の「キー(文言)」に複数のレコードが存在しても検索できる様にしたい。 「実施している設定内容」 1,検索元のコンボボックス名「国地域検索」と設定内容 (1)設定1,データの値集合ソースに「国地域を選択」  ・SELECT DISTINCT 外国人情報テーブル.国地域 FROM 外国人情報テーブル;  ・外国人情報テーブルのフィールド構成:ID、国地域、分類、情報 (2)設定2,「イベント」更新後処理欄のマクロ記述  ・アクション:コントロールの移動=「国地域」  ・レコードの検索=「=[国地域検索]」  ・検索方向=すべてのレコード  ・他は全てデフォルト 2,検索元のコンボボックス名「国地域検索」と検索ボタンの設定内容 (1)設定1,次のデータへ移動する「↓ボタン」と「ボタン↑」のマクロ設定  ・アクション:コントロールの移動=「国地域」  ・レコードの検索=「=[国地域検索]」  ・検索方向=「↓ボタン」=「下へ」、「ボタン↑」=「上へ」  ・他は全てデフォルト 今迄は文言フィールドを検索キーとしていた事もあり、検索先の「キー(文言)」が複数存在するケースが殆ど無かったので、こうした事象に気が付きませんでした。以上ですが宜しくお願いします。

  • SQLで最大値を検索条件にする場合の方法

    下記のような<検索対象データ>から、<取得したいデータ>を取得するSQLがわからず困っています。 ご教授下さい。 【条件】 同一[ID]で[NO]が最大のレコードのみを取得する。 <検索対象データ> ID NO DATA ---------------- AA 1 あいうえ AA 2 あいう AA 3 あい BB 1 かきく BB 2 かき CC 1 さしす CC 2 さし <取得したいデータ> ID NO DATA ---------------- AA 3 あい BB 2 かき CC 1 さし よろしくお願いします。

  • フラグがたっているデータがあったら検索かけたい・・。

    Aテーブルにグループ番号、ID番号、氏名、ステータスフラグが格納されており、BテーブルにID番号、氏名、電話番号、住所が格納されているとします。検索したい条件は、同じグループの中で、ステータスフラグがたっているレコードが1件でもあれば、ID番号を使って、Bテーブルと結合してグループ番号でGROUP BYしてデータがとりたいのです。例えば、Aテーブルにグループ番号001のグループ番号を持つレコードが5レコードあり、そのうちステータスフラグがたっているレコードが1レコード。002のグループ番号を持つレコードが3レコードあり。ステータスフラグがたってるのが0レコードだとします。結果として、001のグループはステータスフラグがたっているレコードがあるから、検索対象になるが、002はステータスフラグがたっているレコードがないので、検索対象にならないといった具合なんですが・・・。よろしくお願いします。自分で考えたSQLは次のものです。SELECT * FROM A, B WHERE A.ID_NUMBER=B.ID_NUMBER GROUP BY A.GROUP_NUMBER HAVING COUNT(A.STATUS=1)>0 こんな感じです。ただCOUNT関数ではこれではダメみたいで・・・。まだ、1年目の新人なので、どなたかご教授お願いします。

  • accessクエリの「SQL」を検索する方法

    accessクエリの中の 「select * form *****」 の中の文字列検索を複数のクエリを対象として実行できるようなソフトまたは 複数のクエリのSQLをテキスト化してくれるようなソフトはあるものでしょうか。 #クエリの結果のレコードの検索でなく、SQLの文字列を検索したいだけ。