質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

637閲覧

SQLでフィールド移動出力の方法

yuki-yuki

総合スコア6

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/04/04 01:10

編集2020/04/04 07:28

前提・実現したいこと

SQLでのフィールドを移動させ結合した状態のテーブルの出力の実現の
考え方を知りたい。

補足情報に問題文を載せています。

正解はできていますので、正解が知りたいのではなく、他のやり方なども学びたいので、できる方法をご存じの方は、考え方を教えてください。
よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージはなし、他のやり方の考え方を知りたい。

該当のソースコード

SQL(Oracle)

1■うまくいったコード。 2SELECT A.カラム1, A.カラム2, A.カラム3, B.カラム3, C.カラム3, A.カラム4 3FORM シート A 4INNER JOIN 5シート B 6ON A.カラム1 = B.カラム1 - 1 7INNER JOIN 8シート C 9ON A.カラム1 = C.カラム1 - 2 10WHERE A.カラム2 IS NOT NULL; 11 12

試したこと

・サブクエリを作り、SELECTに入れてみたがうまくいかず。
・サブクエリを作り、JOINしようとしたがうまくいかず。
・サブクエリを作り、ROW_NUMBERで番号を割り振り「キー」に使おうとするもJOINでうまくいかず。
・UNIONを使おうとするもうまく行かず。
・VIEWやCASE文かな?とも思うもよくわからず。
上記でできるよというものがあれば、私の試行錯誤が間違っていただけかもしれませんので、そこをお知らせいただければと思います。
コードをたくさん書き過ぎて、うまくいったコードのみ上記に記載させていただいております。

補足情報(FW/ツールのバージョンなど)

■問題。以下のテーブルから更に下のテーブルの状態で参照しなさい。

A B C D

+-----+--------+--------+--------+
1| 連番 | 文字列 | 文字列 | 文字列 |
+-----+--------+--------+--------+
2| 連番 | NULL | 文字列 | NULL |
+-----+--------+--------+--------+
3| 連番 | NULL | 文字列 | NULL |
+-----+--------+--------+--------+
4| 連番 | 文字列 | 文字列 | 文字列 |
+-----+--------+--------+--------+
5| 連番 | NULL | 文字列 | NULL |
+-----+--------+--------+--------+
6| 連番 | NULL | 文字列 | NULL |
+-----+--------+--------+--------+
7| 連番 | 文字列 | 文字列 | 文字列 |
:

上記のように並んだテーブルから参照で、以下の形にする方法と考え方を教えていただきたい。
「B1」「C1」などは上のテーブルの元々の配置場所を表します。

A B C D E F

+------+-----+-----+-----+-----+-----+
1| 数字 | B1 | C1 | C2 | C3 | D1 |
+------+-----+-----+-----+-----+-----+
2| 数字 | B4 | C4 | C5 | C6 | D4 |
+------+-----+-----+-----+-----+-----+
3| 数字 | B7 | C7 | C8 | C9 | D7 |
+------+-----+-----+-----+-----+-----+
4| 数字 | B10 | C10 | C11 | C12 | D10 |
+------+-----+-----+-----+-----+-----+
5| 数字 | B13 | C13 | C14 | C15 | D13 |
+------+-----+-----+-----+-----+-----+
6| 数字 | B16 | C16 | C17 | C18 | D16 |
:

連番とは1,2,3,…と続く数字です。

元々のテーブルは
・Aカラムには1, 2, 3,…と続いてまして、
・Bカラムには名前が入っております。
・Cカラムは全て住所が入っておりますが、
1, 4, 7,…は名前の方の『都道府県名』が入っております。
2, 5, 8,…は1, 4, 7,…の名前の方の『市町村名』が入っております。
3, 6, 9,…は1, 4, 7,…の名前の方の『それ以降の住所』が入っております。
・Dカラムには年齢が入っております。

そのテーブルを
Aカラムには数字、
Bカラムには名前、
Cカラムには『都道府県名』
Dカラムには『市町村名』
Eカラムには『それ以降の住所』
Fカラムには年齢
となるように、

元々のCカラムの縦持ちの情報を横持ちにして出力するという問題です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/04/04 01:46

宿題は自力でやるもの。
Orlofsky

2020/04/04 01:51

英数字は半角文字に統一、漢数字はよほどの要求がない限り使わない、程度のプログラミングの暗黙のルールは守ろうね。
Orlofsky

2020/04/04 01:52

>ON A.カラム1 = B.カラム1 ー 1 ー と - (マイナス) の区別が付かないと致命的。
yuki-yuki

2020/04/04 01:54

Orlofsky様、コメントありがとうございます。 質問にも記載しています通り、正解自体は解答済みでので、大丈夫です。
yuki-yuki

2020/04/04 02:00 編集

Orlofsky様、ご指摘ありがとうございます。確かに質問に記入させていただいたコードは-(マイナス)をわざと全角文字にしております。 ほぼ全て全角文字で記入させていただいております、自動で半角文字になっている部分もありますが、元々は全て全角文字で記入したものですのでその点はご了承ください。 そちらのコードはうまくいったコードですので、誤解なさなるようよろしくお願いいたします。
Orlofsky

2020/04/04 02:01

SQLがエラーになるコードを載せるのは愚か過ぎ。
gentaro

2020/04/04 02:18

「高度な出力方法」とは何なのか定義してください。 > 正解はできていますので、正解が知りたいのではなく、他のやり方なども学びたいので、できる方法をご存じの方は、考え方を教えてください。 とのことなので、「『高度な出力方法』がわからなくて『困っている』」理由がないと、ガイドラインに沿った質問のように思えません。 https://teratail.com/help/avoid-asking 「teratailは困っている人の質問を解決するサービスです。そのため、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。 何か困っている理由があり、最適解を見つける為の知見を得たい場合は、その理由や何が知りたいのかを明確に記述してください。」
yuki-yuki

2020/04/04 02:18

Orlofsky様、 Oracle総合1位の方はだったのですね。 大変失礼しました。 自分はSQL初学者で、分かりやすく質問をさせていただくために、元々の問題ではなく、漢数字や全角文字に置き換えて質問をさせていただきました。 Orlofsky様のおっしゃる通り、プロの方からするとそういった書き方は愚か者のやることかもしれません。 よいアドバイスありがとうございます。 あとで漢数字の件と、全角文字の件を修正させていただきます。 よろしくお願いいたします。
yuki-yuki

2020/04/04 02:21

gentaro様、ありがとうございます。 なんと質問したらよいのかわからず、自分なりに考えてタイトルをつけたつもりでしたが、確かに分かりにくいタイトルです。 もう少し考えてあとで修正しておきます。 ありがとうございます。
hoshi-takanori

2020/04/04 07:15

補足情報を見ましたが、いまいち何をどうしたいのかが分かりません。元のテーブルの「連番」や「文字列」は具体的にどのような値で、それに基づいて「数字」や「B1」などと書いてある欄には元のテーブルのどの値に基づいてどのような計算や操作をしたいのかが分かるように書いてください。
yuki-yuki

2020/04/04 07:34

hoshi-takanori様、 ご指摘ありがとうございます。 問題文が分かりにくく申し訳ありません。 補足情報を修正しました。よろしくお願いいたします。 私の考えたコードでは、キーをずらした自己結合を行い、出力結果は、きちんとした状態が出ましたが、 サブクエリなどを使ったやり方などもあるらしく、サブクエリではうまくいかないので、とても悩んでいます。 よろしくお願いいたします。
hoshi-takanori

2020/04/04 07:39

なるほど、たぶん元のテーブルは Excel の住所録をそのまま DB に載せてしまったんですね。 一点確認ですが、一人分のデータは必ず 3 行ってことで大丈夫でしょうか? 途中で行が抜けてるとか、余計な行が入ることはありませんか?
yuki-yuki

2020/04/04 07:47

必ず3行です。 抜けはありません。 LIKEとワイルドカードのやり方も考えたのですが、もし、その他の住所に『市(いち)、町』などで終わる住所が含まれていた場合、その他の住所ではなく、市町村のカラムに行くのではないかと考えて、バグが起こる可能性を考慮しています。 問題文には、その他の住所には『市(いち)、町』などで終わるものはありませんが一応、実際の現場で同じ様な状態が起こるかもしれないため、悩んでいます。 よろしくお願いいたします。
yuki-yuki

2020/04/04 08:01

こちらは書き替えや挿入を行わず、参照でひとつのテーブルとして出力する問題です。
guest

回答1

0

ベストアンサー

こんな感じでしょうか?

テーブル定義

sql

1create table address ( 2 num int primary key, 3 name varchar(255), 4 addr varchar(255), 5 age int 6); 7 8insert into address values (1, '安倍晋三', '山口県', 65); 9insert into address values (2, null, '長門市', null); 10insert into address values (3, null, '東深川正明市', null); 11insert into address values (4, '麻生太郎', '福岡県', 79); 12insert into address values (5, null, '遠賀郡', null); 13insert into address values (6, null, '遠賀町松の本', null); 14insert into address values (7, '河野太郎', '神奈川県', 59); 15insert into address values (8, null, '平塚市', null); 16insert into address values (9, null, '八重咲町', null);

元データ

mysql> select * from address; +-----+--------------+--------------------+------+ | num | name | addr | age | +-----+--------------+--------------------+------+ | 1 | 安倍晋三 | 山口県 | 65 | | 2 | NULL | 長門市 | NULL | | 3 | NULL | 東深川正明市 | NULL | | 4 | 麻生太郎 | 福岡県 | 79 | | 5 | NULL | 遠賀郡 | NULL | | 6 | NULL | 遠賀町松の本 | NULL | | 7 | 河野太郎 | 神奈川県 | 59 | | 8 | NULL | 平塚市 | NULL | | 9 | NULL | 八重咲町 | NULL | +-----+--------------+--------------------+------+

問い合わせ

sql

1select 2 num, 3 name, 4 addr as pref, 5 (select addr from address where num = a.num + 1) as city, 6 (select addr from address where num = a.num + 2) as town, 7 age 8from address a 9where num % 3 = 1;

実行結果

+-----+--------------+--------------+-----------+--------------------+------+ | num | name | pref | city | town | age | +-----+--------------+--------------+-----------+--------------------+------+ | 1 | 安倍晋三 | 山口県 | 長門市 | 東深川正明市 | 65 | | 4 | 麻生太郎 | 福岡県 | 遠賀郡 | 遠賀町松の本 | 79 | | 7 | 河野太郎 | 神奈川県 | 平塚市 | 八重咲町 | 59 | +-----+--------------+--------------+-----------+--------------------+------+

投稿2020/04/04 07:58

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki-yuki

2020/04/04 08:10

そういうことです! ありがとうございます。 サブクエリの中で演算もできるのですね。 私は『where num % 3 = 1』などでおこなった時に演算のエラーが出たため、てっきりサブクエリ内では演算ができないものと勘違いしてました。 サブクエリにしない状態では表示されていたため、とても悩んでいましたが、スッキリしました。ありがとうございます。
yuki-yuki

2020/04/04 14:42

本当にシンプルでわかりやすいコードです。 このコードを見て、他にもできそうな気がしてきました。 さらなる勉強に活かしていきます。 本当にありがとうございます。 回答をいただけたのが一つですが、とてもシンプルでわかりやすいコードですので、ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問