質問: ### やりたいこと 集計ソフトをVisualBasicで作成しています。データベースにSQLite(3.24.0)を使用しています。 以下にテーブル構造を示します。 スコアデータテーブルの前半点数と後半点数を合計し、グループごとにその合計した点数が高い順に4人選び、その4人の点数を合計してグループの点数としたいのですが、どのようにSQLを書いたらいいのかわかりません。 教えていただけるとありがたいです。 ### テーブル構造 **グループマスタ** | 列名 | 型 | 備考 | | --- | --- | --- | | ID | Integer | 主キー,AutoIncrement | | グループ名 | Text | | **プレイヤーマスタ** | 列名 | 型 | 備考 | | --- | --- | --- | | ID | Integer | 主キー,AutoIncrement | | 氏名 | Text | | | 生年月日 | Text | | | グループID | Integer | 外部キー(グループマスタのID列を参照) | **スコアデータ** | 列名 | 型 | 備考 | | --- | --- | --- | | プレイヤーID | Integer | 主キー,外部キー(プレイヤーマスタのID列を参照),AutoIncrement | | 前半点数 | Integer | デフォルト値(0) | | 後半点数 | Integer | デフォルト値(0) | ### やったこと ``` SELECT プレイヤーID, (前半点数+後半点数) AS 合計点数 FROM スコアデータ ```
回答: > > SELECT プレイヤーID, (前半点数+後半点数) AS 合計点数 FROM スコアデータ > > > ほとんど何もできてないようですね。 SQLite でカーソルが使えるかどうかわかりませんが、使えるのであればカーソルを使ってはいかがですか? 質問者さんの DB では試せませんが、Microsoft の SQL Server 用サンプルデータベース Northwind の Catagories と Products テーブルを例に使うと、(Catagories が「グループマスタ」、Products が「プレイヤーマスタ」+「スコアデータ」に該当すると考えてください): !イメージ説明 以下のようになります。なお、TOP 4 で上位を取得しているだけで、同点があった場合の処理は考えていませんので注意してください。 !イメージ説明 SQLite でカーソルが使えない場合は VB.NET のコードで処理することを考えてはいかがですか? まず「グループマスタ」から全 ID を取得し、それをベースにループを回して「プレイヤーマスタ」+「スコアデータ」にグループ別にクエリを投げてデータを取得するという感じでできると思います。