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

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

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

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

Q&A

解決済

2回答

2957閲覧

ビューを使わずに同一テーブルから異なる基準で集計した2つの結果を結合するクエリー

true

総合スコア440

SQLite

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

0グッド

0クリップ

投稿2015/06/16 01:24

いつもありがとうございます。

いま、A,B,Cの3名のプレーヤーが20面ダイスを振り合い、勝ったほうが振り続け、負けた者は交代するというもので、最初はA,Bが対戦するものとします。

そして各プレーヤーの先攻時と後攻時のスコアを集計します。

具体的には下記のようにDBを作りました。viewを使って先攻、後攻時のスコア集計テーブルを作って両者を結合するという流れになっています。

これをviewを使わずに1文で実現するqueryを考えているのですがなにかよい案があればご教示ください。inner joinを使うものと思うのですが、いろいろ試したのですがよく使い方が分かりませんでした。特に1つのqueryで複数のgroup byを使いつつ、結合をどうすればいいか、頭が混乱しています。

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

lang

1 2// p1:先攻プレーヤー、s1:先攻スコア、p2:後攻プレーヤー、s2:後攻スコア 3sqlite> create table dice (p1 text, s1 integer, p2 text, s2 integer); 4 5// サンプルデータ投入 6sqlite> insert into dice values ("A", 12, "B", 5); 7sqlite> insert into dice values ("A", 15, "C", 9); 8sqlite> insert into dice values ("A", 8, "B", 18); 9sqlite> insert into dice values ("B", 20, "C", 15); 10sqlite> insert into dice values ("B", 5, "A", 8); 11sqlite> insert into dice values ("A", 9, "C", 11); 12sqlite> insert into dice values ("C", 15, "B", 12); 13sqlite> insert into dice values ("C", 15, "A", 9); 14sqlite> insert into dice values ("C", 3, "B", 17); 15sqlite> insert into dice values ("B", 12, "A", 7); 16 17// 各プレーヤーの先攻時、後攻時のスコアを集計するview 18sqlite> create view sum1 as select p1, sum(s1) as t1 from dice group by p1; 19sqlite> create view sum2 as select p2, sum(s2) as t2 from dice group by p2; 20 21// 結合 22sqlite> select p1, t1, t2 from sum1 left outer join sum2 on p1=p2; 23A|44|24 24B|37|52 25C|33|35 26

sqlite3 --version 3.6.20

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

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

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

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

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

guest

回答2

0

lang

1select p1, t1, t2 from sum1 left outer join sum2 on p1=p2

sum1,sum2を、それぞれのcreate view文のas以降を括弧で括り、置き換えてみてください。

投稿2015/06/16 01:35

sho_cs

総合スコア3541

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

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

true

2015/06/16 02:00

ありがとうございます!組み立ての流れが分かりやすく、役に立ちました。
guest

0

ベストアンサー

インラインビューを使う事で単純に一文で表現できます。

lang

1select sum1.p1, sum1.t1, sum2.t2 2from (select p1, sum(s1) as t1 from dice group by p1) sum1 3left outer join (select p2, sum(s2) as t2 from dice group by p2) sum2 4on sum1.p1=sum2.p2

投稿2015/06/16 01:34

chiku_

総合スコア1464

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

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

true

2015/06/16 01:58

ありがとうございます!インラインビューは知りませんでした。しかもFROM句に入れるとは想像も付きませんでした。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問