このテーブルに1位~5位の仮テーブルを結合させています。, 処理相手となるデータの性質をきちんと踏まえたうえで、どの様なクエリを出すべきか考えなくてはいけません。 クエリを思いつかなかった子のために。これはあくまでヒントだぞ。 追記すべき情報のご指摘ありがとうございます。 oracle機能 sql [SQL] 縦持ちのテーブルから横持ちのデータとして検索する 投稿日:2018年12月23日 更新日: 2018年12月24日 3 / クリップ 参考. Why not register and get more from Qiita? 検索できる想定です。, そちらのアプリケーションの制限で、 0, 【募集】 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 0, サイトのSSL化後、Twitter for iPhoneアプリからサイトへアクセスできません, 回答 ・編集 2016/09/21 11:39, PIVOTのinに指定するグループ化対象列の値をどうにかして動的に変更できないでしょうか。, 例えば、テーブルもしくはSELECT結果の項目として。 まぁレコード数少ないんでそれでもいいですけど、もし「売上年」が「売上年月日」だったらどうします?1000レコード超えますぞ。, 単に縦長にして結果を見たいだけならSQL最初の“INSERT INTO 売上ランキング縦”はいらないです。 PIVOTの使い方 What is going on with this article? 2007年のデータは、2位と3位のレコードしかない。よって、1位の仮テーブルを作ると2007年のレコードは存在しないので、後続の仮テーブルにいくら2007年のレコードが存在しても結合が出来ない事になります。, つまり、欠損レコードが存在する場合にはそれを補う様なレコードを補填しない限り意図通り結合は出来ないのです。, 結合のキーは 売上年 なので、全売上年を保持しているテーブル「売上年」を作りました。 1 / クリップ 第8回 PivotとUnPivot  Help us understand the problem. LATERAL VIEW explode で展開する方法があります。 SELECT t1 . Excelに落としてカット&ペーストで変形する?ご冗談を(^^ カラムの配列を作ってから CROSS JOIN unnest で展開するやり方です。PostgreSQL でも使えます。, Pivot 下図のように、「縦持ち」のテーブルを「横持ち」に置き換えることをピボット(pivot)、逆に「横持ち」のテーブルを「縦持ち」に置き換えることをアンピボット(unpivot)と呼びます。これらの変換を行なう方法をまとめました。, Unpivot (2)横展開する 分析系のシステムだと横展開(繰り返し)を行う機会が多いと思いますが、どのように行っていますか(これは、第一正規形で排除されるものですが、分析系システムではよく使われます)。 0, 回答 というものになってるとします。, それをPIVOTを使用して、  後輩:「どんなおもちゃ使ってるんです」 CSSだけでメニューが開いたり閉じたりするアコーディオンを作る!javascript不要, 【iPhone iPad】heic形式で撮影保存した写真をMacやPCに転送する際はjpgに変換されるように設定する, 【MacBook Pro】修理が完了してMacBook ProがAppleから自宅に宅配便で到着, 【iPhone iPad】iPhoneのツイッターアプリでユーザー名をコピーする方法, 【iPhone・iPad】投稿の準備中にエラーが起きました。後でやり直してください。, 【jQuery】jQueryでスマホ画面は縦方向PC画面は横方向に展開するアコーディオン, かつてはJavaScriptを利用していたものの、今ではCSSのみで実装できる10の小技, CSSだけでメニューが開いたり閉じたりするアコーディオンを作る!javascript不要. ユーザ、年月、売上 0, 回答 key , t2 . アプリケーション側で、  先輩:「うるさい早くやれ」, テーブルはこんなものでよいでしょう。 SUM関数は、グルーピングされた項目の集計を行った結果を返します。, 1位製品の部分を見ると、「みかん」の他は全て長さゼロの文字列(NULL)です。MAX関数は みかん と 長さゼロの文字列 の中から最大値である みかん を選び出します。 1 / クリップ 縦軸にユーザ、横軸に年月、値は売上のサマリーを用いたいです。, ただし、PIVOTのinにはグループ化対象列の値を直接入れる必要があると思ってます。 UNION では ( 'A' ,1 )のレコードが統合され1レコードのみになっています。, 先輩:「さっきの縦テーブルにだいずとここあ追加しといてくれない?」 cdとsub_cdを同じ項目として扱う設定をしており、 LATERAL VIEW explode で展開する方法があります。. 4, 回答 その隣は「順位が2位の製品」です。その判定をやはり項目「順位」で行っています。 投稿 2018/06/13 17:14 以降の例では Oracle9iリリース2で説明しています。, データベースのテーブルには、何故か無駄に横長のものがあったりします。 よろしくお願いいたします。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, 2018/06/13 17:21 編集, 「A1,111,222,333,A2,444」こんな風な返却内容の識別は可能なんですか?, Oracleのバージョン次第で対応も変わると思いますので環境についても記述された方が良いかと思います。, いったんバラして、たたみ直す構成にしてみました。 oracleのバージョンは11です。, 取得した返却結果を、別のアプリケーションにて使用します。 本例では、項目「順位」を使いました。, OUTER JOIN で書くとどうなるかという話。 1位売上の部分を見ると 40 の値がひとつだけで後は全てNULLです。SUM関数は 40 と NULL を集計します。NULLは計算の対象とされないので、40 が結果となります。, 同じように2位~5位もMAX関数およびSUM関数で計算され、結果、売上年単位で集約された1レコードに変換されます。, 横に並べる為には、横に並べる順番を示す項目が元のテーブルに存在しなければなりません。 teratailを一緒に作りたいエンジニア, group byかdistinct で重複を排除したものを元にすれば良いかと思いますが。, 正規化ができていないからテーブル設計を見直しましょう。通常第3正規形までやります。今のままだとどんどんトリッキーなコードを書かなければならなくなり、システムの維持が重い負担になります。. 機械的に「縦横変換はこのクエリ!」という風にはいかないので、注意が要ります。, これ、プリントアウトしていいですか?っていうかもうしちゃいましたけど。。。 - むらかみ (2007年09月10日 23時35分01秒), いいけど実名は出しちゃ駄目だろ(^^; - 510 (2007年09月11日 11時54分38秒), ちょうど探してたんだ。使わなかったけど。灯台下暗しだな。 - aka (2011年03月25日 14時16分56秒), 意外な人がコメント残していくなーww - 510 (2011年03月26日 15時11分29秒), ---------------------------- -------- --------------------------, ---- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------, ----------------------------------------- -------- ----------------------------. FROM句のサブクエリとして SELECT 文を横項目の数だけ書き連ねます。 ただ、年月の最大値はどんどん増えるので値を指定してしまうと Oracle 11gでは、必要な操作を行うPIVOT操作が提供されます。 Oracle 11gソリューション. そして、GROUP BY 句で「売上年」が同じレコードをグルーピングしています。, MAX関数は、グルーピングされた項目内で、一番大きな値を持つ項目を返します。 複数列を行列変換する場合、for ~ in ()の中の指定で as句による別名をつけるところがポイントです。 返される列名は一定のルールで付けられますので「select * ~」で取得してみるとわかります。