🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

2回答

610閲覧

SQLのSELECT文の記述方法について

senb

総合スコア1

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

0グッド

0クリップ

投稿2021/01/20 18:17

SQL初学者です。
SELECT文の記述方法がわからないので教えてください。
利用しているRDBMSはSQLiteです。

前提

以下のようなテーブルとデータがあり、
tableBには同一user_idでpointが2個ずつ登録されているものとします。

tableA

user_idpoint1point2
1NULLNULL
2NULLNULL
3NULLNULL

tableB

user_idpoint
150
178
266
269
390
371

実現したいこと

tableBの同一user_idのpoint2つを、tableAの対応するuser_idのpoint1, point2に埋め込んだものをSELECTで取得して、以下のような結果を得たいです。
2つのpointはpoint1とpoint2のどちらに振られても構いません。

期待する結果

user_idpoint1point2
15078
26669
39071

恥ずかしながら実現方法が何も思い浮かびません。
考え方やヒントとなるようなことでも構いませんのでご教授ください。

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

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

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

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

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

Orlofsky

2021/01/20 18:55

SQLをシンプルにパフォーマンス良く実行できるように、テーブルは データベースの正規化 https://oss-db.jp/measures/dojo_info_04.shtml に沿って設計します。 point1, point2 は繰り返し(配列)になります。第1正規化で繰り返しを排除します。 通常第3正規化まで行います。
takasima20

2021/01/20 20:23

双方のテーブルで user_id の過不足はある前提なのかな? ないんだったら tableB だけで処理できそう
m.ts10806

2021/01/20 21:44

point1とpoint2の規則がデータ構造上不明な状態ではかなり複雑なコードを組まざるを得ないように思います。SQLiteで一発でできるかどうか。 テーブル構造変えられないのでしたらアプリケーション側からアクセスしたほうが。 それか、わざわざ別テーブルにしなくていいのでは。
guest

回答2

0

ベストアンサー

絶対に2件のデータがtableBにあるのであれば

sql

1select id 2 , min(point) as point1 3 , max(point) as point2 4from tableB 5group by id

これでok

tableAにあってtableBにないidも出したい場合は
上記をleftjoinする感じになります

投稿2021/01/21 02:23

sousuke

総合スコア3830

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

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

YT0014

2021/01/21 04:46

user_idが3の結果が異なります。値の大小ではなく、出現順で、point1とpoint2を決める仕様かと。
senb

2021/01/21 14:39

min/maxはこういう使い方もできるのですね。 今回やりたかったことに対して必要十分でした。 ありがとうございます。
YT0014

2021/01/21 15:06

ごめんなさい、順番には規則がなかったんですね。読み落としていました。失礼いたしました。
guest

0

縦のものを横にするのはクロス集計と呼ばれます。
この変換の際にはどのような並びにするかの条件が必要になります。
tableBには条件が無いので、row_number()を用いてID毎の連番を生成しこれを条件にします。

SQL

1select id 2 , max(case when seq=1 then point end) as point1 3 , max(case when seq=2 then point end) as point2 4from ( 5 select *, row_number() over(partition by id) as seq 6 from tableB 7) step1 8group by id

tableAに反映したいなら上記を元にした更新(UPDATE FROM)を行って下さい。

投稿2021/01/20 23:41

sazi

総合スコア25327

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

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

senb

2021/01/21 14:39

並びの条件を作るというのがとても参考になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問