• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLにて縦を横へ展開)

SQLで縦を横に展開する方法とは?

このQ&Aのポイント
  • SQLで縦構造のデータを横に展開する方法をご教示ください。
  • 例えば、注文表と注文オプション表を結合して注文一覧を作成する方法を教えてください。
  • お手数ですが、サンプルSQLをいただけると助かります。

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

  • ベストアンサー
  • baunce
  • ベストアンサー率66% (2/3)
回答No.4

肝は「注文オプション表」ですよね。 「注文オプション表」を「tb1」で読み替えて 以下SQLを見てください。 uff-n さんが期待する 結果にはさらに副問い合わせを使って注文表と 結合する必要がありますが、まぁなんとか1SQLで書けると 思います。 同一注文番号のデータがあまりにも多い場合は以下SQLは少し苦しいですね。 あと、Oracleに限定したSQLであることも少し不満が残りますが参考にどうぞ。 ---検証データ作成---- create table tb1(c1 number,c2 varchar2(10)); insert all into tb1 (c1,c2) values(111,'aa3') into tb1 (c1,c2) values(111,'aa2') into tb1 (c1,c2) values(222,'aa1') into tb1 (c1,c2) values(333,'aa1') into tb1 (c1,c2) values(333,'aa2') into tb1 (c1,c2) values(333,'aa3') into tb1 (c1,c2) values(444,'aa5') into tb1 (c1,c2) values(444,'aa5') select * from dual ; ---縦を横に展開するSQL select c1,max(c2_1) n01,max(c2_2) n02,max(c2_3) n03,max(c2_4) n04 from ( select t.c1, decode(rk,1,c2,null) c2_1, decode(rk,2,c2,null) c2_2, decode(rk,3,c2,null) c2_3, decode(rk,4,c2,null) c2_4 from ( select c1,c2,row_number() over(partition by c1 order by c2 ) rk from tb1 )t ) group by c1 --結果 C1  N01 N02 N03 N04 ---  --- --- --- --- 111  aa2 aa3   222  aa1     333  aa1 aa2 aa3 444  aa5 aa5   どうでしょうか?期待した結果でしたか?

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

その他の回答 (4)

  • baunce
  • ベストアンサー率66% (2/3)
回答No.5

先ほど回答を入れたbaunceです。 申し訳ないです。すでに私と同じような内容で既にみなさん が回答されていました。 むだな投稿してしまいました。 すみません。

uff-n
質問者

お礼

御回答ありがとうございました。 お礼遅くなりまして、失礼しました。

全文を見る
すると、全ての回答が全文表示されます。
  • Struggler
  • ベストアンサー率18% (97/527)
回答No.3

素直に別プログラムでやられたほうがいいと思います。 後々のメンテナンスでさわれないSQLになってしまいますよ。

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

横展開する個数が決まっているなら、以下のようなSQLで横に展開できます。 select 注文番号,max(decode(R,1,オプション)) オプション1,max(decode(R,2,オプション)) オプション2 from ( select 注文番号,オプション,row_number() over(partition by 注文番号 order by オプション) R from 注文オプション表 ) group by 注文番号 ;

全文を見る
すると、全ての回答が全文表示されます。
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

こんな感じではどうでしょうか? select 注文番号,注文商品,注文金額 ,max(case when recnum = 1 then オプション else null end) オプション1 ,max(case when recnum = 2 then オプション else null end) オプション2 ,max(case when recnum = 3 then オプション else null end) オプション3 --以下、必要なだけ・・ from (select 注文表.注文番号,注文表.注文商品,注文表.注文金額,注文オプション表.オプション ,row_number() over(partition by 注文表.注文番号 order by 注文オプション表.オプション) recnum from 注文表 inner join 注文オプション表 on(注文表.注文番号 = 注文オプション表.注文番号)) group by 注文番号,注文商品,注文金額; 列名は動的に設定したい、とかでしたら普通のSQLだけでは難しいと思います。

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

関連するQ&A

  • SQLが分かりません

    SQLの初心者です。 ACCESSで売上げ管理をしようと考えています。 売上げに関するテーブルは以下のようになっています。 ●売上げヘッダ テーブル   伝票番号(キー)   売上日   売上げ金額    : ●売上げ明細 テーブル   伝票番号(キー)   枝番(キー)   商品コード   商品名   単価   数量   値引金額    : 値引金額は商品ごとに決まり、値引きしなければ0が、値引きがあればその金額が入ります。 売上げ一覧を表示する時に、以下のようなイメージで、 ワークテーブルを作って、値引きがあれば「あり」と画面に表示させたいのです。 ※無い時は何も表示させません 伝票番号  売上日  売上げ金額 値引き有無 9999 2004/1/1 10,000 10000 2004/1/2 1,500 あり 10001 2004/1/2 20,000 10002 2004/1/3 18,900 10003 2004/1/4 23,500 あり 1回のSQLで実行したいのですが、SQLには詳しくないので、 どのように書けばよいか分かりません。 よろしくお願いします。 値引き区分が無ければ、売上げヘッダを見るだけなのですが、 値引きがあるかどうかは、売上げ明細まで見なければいけないので、 SQLの書き方が分からないのと、以下のようなワークテーブルを 作る必要があると思うのですが、どうなのでしょうか。 ●ワーク テーブル   伝票番号   売上日   売上げ金額   値引き区分

  • SQL文について

    商品表と注文表から、注文のある商品名を知るためのSQL文で、適切なものはどれか。 商品表(商品番号,商品名,単価) 注文表(注文番号,商品番号,注文数) 答えはこれ↓なんですが、なぜなのか分かりません。 SELECT 商品番号,商品名 FROM 商品表        WHERE EXISTS (SELECT * FROM 注文表 WHERE 商品番号 = 商品表.商品番号)

  • 複雑なSQLを1本でまとめたい

    Oracle10gで開発をしています。 1本のSQLで下記のような結果を返したいのですが、 やり方がわかりません。 どなたかご教授頂けないでしょうか? Aテーブル No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 3   003   b001  10    10 4   004   c001  5     2 5   005   d001  20    0 SELECT * FROM Aテーブル WHERE 在庫数 - 注文数 > 0 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 4   004   c001  5     2 5   005   d001  20    0 となりますが、 これを 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 4   004   c001  5     2 5   005   d001  20    0 という風に、1番目の結果+1番目の結果にある商品の 他レコードも抽出したいのですが、どうしたらよいでしょうか?

  • SQLについて何ですが

    一つのSQLで下記の様な検索が出来ないかと考えています、 大分類に分けて大分類の中で売れている商品のTOP10を表示し、 現在表示されている商品を抜いた売れている商品TOP100もに表示できるようとしています、 分類のテーブル・商品がどの分類に当てはまるのか関連づけし注文数も保持しているテーブル・商品の売れ行きを保持しているテーブルがあり 分類テーブルには15個(将来的に増える可能性ある)の分類ワードが入っていて、分類別に売れているTOP10を表示し重複部分もあるので最大150個の商品が表示されるようになっています、 全商品の売れ行きTop「表示されている商品プラス100件」を割り出しその中から表示商品はずしてみようと思いこの様なSQL文と作ったのですが今一うまくいっていないような気がします、 「select 商品名 注文数 from 商品テーブル    where 商品名 not in( select 商品名 from 分類商品テーブル where 分類 in ( select 分類 from 分類テーブル )    order by 注文数 desc limit 10) order by 注文数 desc limit 表示商品数+100」 どうもうまく表示できていない様な気がしているのですが、 このSQLどうなのでしょうか? ほかにもっといいSQL文があれば教えてください。 」

  • 【SQL2000】アクセスログからレコメンド機能(ビュー)を作りたい

    SQL文の組み立て方がさっぱりわからないので質問です。 ある商品テーブルの閲覧履歴テーブルから、レコメンドエンジンを 作りたいと思っています。 (amazonなどである「この商品を見た人はこんな商品も見ています」ってヤツです) 以下AテーブルからBのビューを導きたいのですが どのようなSQL文を書けばいいのでしょうか? ■Aテーブル ┌────┬────────┐ │商品番号│見た人     │ ├────┼────────┤ │1    │A        │ ├────┼────────┤ │1    │B        │ ├────┼────────┤ │2    │A        │ ├────┼────────┤ │2    │B        │ ├────┼────────┤ │4    │C        │ ├────┼────────┤ │5    │D        │ ├────┼────────┤ │9    │B        │ ├────┼────────┤ │10   │B        │ ├────┼────────┤ │11   │D        │ ├────┼────────┤ │11   │B        │ ├────┼────────┤ │12   │A        │ ├────┼────────┤ │12   │B        │ ├────┼────────┤ │12   │C        │ └────┴────────┘ ■Bビュー ┌────┬────────┐ │商品番号│他に見た商品番号│ ├────┼────────┤ │1    │2        │ ├────┼────────┤ │1    │12       │ ├────┼────────┤ │2    │1        │ ├────┼────────┤ │2    │12       │ ├────┼────────┤ │11   │5        │ ├────┼────────┤ │11   │1        │ ├────┼────────┤ │11   │2        │ ├────┼────────┤ │11   │10       │ ├────┼────────┤ │11   │12       │ ├────┼────────┤ │12   │1        │ ├────┼────────┤ │12   │2        │ ├────┼────────┤ │12   │4        │ ├────┼────────┤ │12   │9        │ ├────┼────────┤ │12   │10       │ ├────┼────────┤ │12   │11       │ └────┴────────┘ 考え方だけでも構いませんのでご教示いただければ幸いです。

  • SQL文について

    つい最近SQL文を勉強し始めたのですが、わからないことがあるので質問します。 関係 発注表 商品番号 業者番号 数量 1122 2323 1 1124 2323 2 1123 2000 1 関係  商品表 商品番号 単価 1122   400 1124   600 という様な関係が存在した時、発注した合計金額が1000円を越えた業者のみを抜き出したい時はどのようなSQL文をかけばいいのでしょうか? いまいち分からないので是非解答お願いします。

  • このぐるぐるSQLクエリまとまりますか?

    ピボット集計の理解が難しくて難儀してます このような予定表を作るのですが毎月ごとに集計してやるのに 4回問い合わせております。一回でえいやっと投げるにはどう記述しましょう? mysql 5.0です -- 今月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') group by 商品番号; -- 来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 1 MONTH, '%Y%m') group by 商品番号; -- 再来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 2 MONTH, '%Y%m') group by 商品番号; -- ささらい月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 3 MONTH, '%Y%m') group by 商品番号;

  • SQLを教えてください!!

    テーブルAとテーブルBがあり、両方に存在しないものを抽出してエラーとする処理を行いたいのですが、 どういうSQlを書いたらいいのか教えてください。 下記例としてテーブルにデータがあったとしたら、結果として 004 商品D 005 商品E 006 商品G というデータを抽出したいのですが・・ テーブルA             テーブルB -------------        ----------------------- コード  商品名 NO コード   商品名 001 商品A        1 001 商品A 002 商品B        2 001  商品A 003 商品C        3 002   商品B 004 商品D        4 003 商品C 006 商品G        5 003 商品C                 6 005 商品E

  • SQL Server 縦データを横データに

    お世話になります。 下記のテーブルから下記の条件で データを出力するSQL文を作成したいのです。 アドバイスお願い致します。 条件1:NAMEはAを抽出 条件2:ICHIはグループ集計 条件3:ITEMはD2とD3を抽出 TESTテーブル NAME ICHI ITEM DATA ----- ---- ---- ---- A A1 D1 1 A A1 D2 2 A A1 D3 3 A A1 D4 4 A A2 D1 10 A A2 D2 20 A A2 D3 30 A A2 D4 40 B A3 D1 100 B A3 D2 200 B A3 D3 300 B A3 D4 400 データ出力結果 NAME ICHI DATA DATA ----- ---- ---- ---- A A1 2 3 A A2 20 30

  • 簡単なSQLに関して

    初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容 Bテーブル  社員番号、日付、内容  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。