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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

2回答

985閲覧

うかかなゆかはらやや

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2020/03/26 14:23

編集2020/04/01 08:45
コード ```### ```~~````````````````````````ここに言語を入力 ここに言語を入力

ここに言語を入力

ここに言語を入力

ここに言語を入力

ここに言語を入力

ここに言語を入力

ここに言語を入力

ここに言語を入力

ヘディングのテキスト

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

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

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

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

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

sazi

2020/03/27 00:11

別なアカウント作られてまで同じ質問をする理由が分かりません。 何故外部結合に限定されるのでしょうか? 理由が分かれば適切な回答が得られると思いますよ
x_x

2020/03/27 01:44

サポート切れの SQL Server 2008 ですか?
guest

回答2

0

外部結合でなるべく表示してほしいと指示があった

多分、SQLServerの性能に関する特性について、そのような指示が出ているんでしょうけど、こんな正規化されていないテーブルに対してまでそれを言うかって感じですね。

SQLに関しては、「住所」「趣味」「それ以外」でそれぞれのクエリーを作成すれば正規化されたイメージになるので、それを外部結合して下さい。

投稿2020/03/27 00:21

sazi

総合スコア25327

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

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

退会済みユーザー

退会済みユーザー

2020/03/27 09:15 編集

ヒントありがとうございます。 外部結合でという指示も自分が初心者なので基本を理解しておけというかんじでだしたんだとおもいます
guest

0

SQLを記載すると丸投げの質問に回答する感じになってしまうのでヒントだけ。
ただし以下の前提条件がないと、対応できません。

前提条件
1.姓が「空文字またはNULL」でない行から次の「空文字またはNULL」でない行までがID昇順で並んでいること
2.住所の入力は最大3つまでで、姓が「空文字またはNULL」でない行から連続していること

説明するうえでの呼び方
姓がある行の住所を住所1
住所1のID+1した行の住所を住所2
住所1のID+2した行の住所を住所3

上記の前提で
K3_Sheet1に住所2の行を取得したテーブルと住所3の行を取得したテーブルを外部結合すればよい。

住所2の行は、姓が「空文字またはNULL」でない行のID+1。
→逆にID-1すれば結合すべき住所1の行のIDになる
住所3の行は、姓が「空文字またはNULL」でない行のID+2。
→逆にID-2すれば結合すべき住所1の行のIDになる

あとは、住所1、住所2、住所3を文字列結合したときにどれかがNULLの場合の考慮をすること

以上です。

--追記
ID2がnullの行を最後に省いて、ID昇順に並べ替えるのを忘れてました。

投稿2020/03/26 15:10

編集2020/03/27 08:29
storm3

総合スコア330

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

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

退会済みユーザー

退会済みユーザー

2020/03/27 04:56 編集

回答していただきありがとうございます。 住所2の行をwhere ID%3=2で取得しようとすると京都市がぬけてしまいます。 抜き取る基準がよくないのでしょうか?
storm3

2020/03/27 08:27

すみません。-1と+1が微妙に間違ってましたね。 回答を修正します。 住所1のID+1した行の住所を住所2 住所1のID+2した行の住所を住所3 ですね。
storm3

2020/03/27 08:52

>where ID%3=2 この取得条件がなぜでてくるかよくわかりません。 K3_Sheet1 LEFT JOIN 住所2の行は、姓が「空文字またはNULL」でない行のID+1。 ON 逆にID-1すれば結合すべき住所1の行のIDになる LEFT JOIN 住所3の行は、姓が「空文字またはNULL」でない行のID+2。 ON 逆にID-2すれば結合すべき住所1の行のIDになる だけです。%3は使いません。 これで結合した結果にはID=13のレコードもでてきてしまいます。 そこで、最後に結合し終わった結果から不要な行をWHERE句で取り除くだけです。
退会済みユーザー

退会済みユーザー

2020/03/27 09:08

ありがとうございます。難しく考えすぎていたようです。その方法だとかなりシンプルな感じになりそうです。
退会済みユーザー

退会済みユーザー

2020/03/27 12:24 編集

select ROW_NUMBER()OVER(ORDER BY A.ID) as ID ,A.姓 ,A.名 ,A.性別 ,A.住所+B.住所+C.住所 as 住所 ,A.年齢 ,A.ID2 ,A.趣味 from K3_Sheet1 as A left join K3_Sheet1 as B on A.ID=B.ID-1 left join K3_Sheet1 as C on A.ID=C.ID-2 where A.ID2 is not null こんな感じになりました。 joinは二ついりますよね?
storm3

2020/03/28 07:27

>joinは二ついりますよね? そうです。骨組みはあってます。 ただ、B(住所2)テーブル、C(住所3)テーブルに抽出条件がないので、私のロジックが理解できているかは不安ではありますが、これ以上答えると正解をそのまま言ってしまうことと同じなので、あとはがんばってみてください。 ただ、他の方の指摘でもあるように、そもそもK3_Sheet1はDBテーブルとしての役割はもっていないので、SQLのロジックを頑張って考えるよりも、別プログラムで加工したほうがよっぽど簡単です。 プログラムならSQLで単純に全件ID昇順でSELECTしたら、あとは姓があるレコードでキーブレクするようなループで処理するだけですから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問