はじめに
もともとデータベースにボートレースの過去のレース情報と選手情報を保存していたので、そのデータベースから新概念データを取得するSQLのクエリを書いてみました。
データベースの構造
データベースには現在以下の4つのテーブルがあります。
- レーサーテーブル
 - 出走表テーブル
 - 進入コーステーブル
 - 結果テーブル
 
以下1つずつテーブルの構造の内、必要な列名のみを説明します。
レーサーテーブル
MRacer
| 列名 | 日本語列名 | 
|---|---|
| RacerID | 選手番号 | 
| Name | 選手名 | 
出走表テーブル
DCard
| 列名 | 日本語列名 | 
|---|---|
| RaceDate | レース日 | 
| JoCD | レース場コード | 
| RaceNO | レースナンバー | 
| BoatNO | ボートナンバー | 
| RacerID | 選手番号 | 
進入コーステーブル
DCourse
| 列名 | 日本語列名 | 
|---|---|
| RaceDate | レース日 | 
| JoCD | レース場コード | 
| RaceNO | レースナンバー | 
| CourseNO | 進入コース | 
| BoatNO | ボートナンバー | 
結果テーブル
DResult
| 列名 | 日本語列名 | 
|---|---|
| RaceDate | レース日 | 
| JoCD | レース場コード | 
| RaceNO | レースナンバー | 
| Ranking | 着順 | 
| BoatNO | ボートナンバー | 
| Technique | 決まり手 | 
分かりづらいかもしれませんが、レースナンバーは第何レースか、ボートナンバーは何号艇かのデータを持つ列です。
新概念データを取得するクエリ
コードは汚いですが、新概念データを取得するためのクエリを載せます。
パラメータは以下の通りです。
| パラメータ名 | パラメータ日本語名 | データ型 | 説明 | 
|---|---|---|---|
| p_RaceDateFrom | 開始レース日 | DATE | 集計期間の開始日を設定します | 
| p_RaceDateTo | 終了レース日 | DATE | 集計期間の終了日を設定します | 
SELECT
T2.RacerID AS RacerID,
T2.Name AS Name,
T2.CountCourseNO1 AS CountCourseNO1,
T2.CountCourseNO1Nige/T2.CountCourseNO1*100 AS RateCourseNO1Nige,
T2.CountCourseNO1Makurare/T2.CountCourseNO1*100 AS RateCourseNO1Makurare,
T2.CountCourseNO1Sasare/T2.CountCourseNO1*100 AS RateCourseNO1Sasare,
T2.CountCourseNO1Makurizasare/T2.CountCourseNO1*100 AS RateCourseNO1Makurizasare,
T2.CountCourseNO2 AS CountCourseNO2,
T2.CountCourseNO2Nigashi/T2.CountCourseNO2*100 AS RateCourseNO2Nigashi,
T2.CountCourseNO2Makuri/T2.CountCourseNO2*100 AS RateCourseNO2Makuri,
T2.CountCourseNO2Sashi/T2.CountCourseNO2*100 AS RateCourseNO2Sashi,
T2.CountCourseNO3 AS CountCourseNO3,
T2.CountCourseNO3Makuri/T2.CountCourseNO3*100 AS RateCourseNO3Makuri,
T2.CountCourseNO3Sashi/T2.CountCourseNO3*100 AS RateCourseNO3Sashi,
T2.CountCourseNO3Makurizashi/T2.CountCourseNO3*100 AS RateCourseNO3Makurizashi,
T2.CountCourseNO4 AS CountCourseNO4,
T2.CountCourseNO4Makuri/T2.CountCourseNO4*100 AS RateCourseNO4Makuri,
T2.CountCourseNO4Sashi/T2.CountCourseNO4*100 AS RateCourseNO4Sashi,
T2.CountCourseNO4Makurizashi/T2.CountCourseNO4*100 AS RateCourseNO4Makurizashi,
T2.CountCourseNO5 AS CountCourseNO5,
T2.CountCourseNO5Makuri/T2.CountCourseNO5*100 AS RateCourseNO5Makuri,
T2.CountCourseNO5Sashi/T2.CountCourseNO5*100 AS RateCourseNO5Sashi,
T2.CountCourseNO5Makurizashi/T2.CountCourseNO5*100 AS RateCourseNO5Makurizashi,
T2.CountCourseNO6 AS CountCourseNO6,
T2.CountCourseNO6Makuri/T2.CountCourseNO6*100 AS RateCourseNO6Makuri,
T2.CountCourseNO6Sashi/T2.CountCourseNO6*100 AS RateCourseNO6Sashi,
T2.CountCourseNO6Makurizashi/T2.CountCourseNO6*100 AS RateCourseNO6Makurizashi
FROM (
    SELECT
    T1.RacerID AS RacerID,
    MAX(T1.Name) AS Name,
    SUM(CASE WHEN T1.CourseNO=1 THEN 1 ELSE 0 END) AS CountCourseNO1,
    SUM(CASE WHEN T1.CourseNO=1 AND T1.Ranking=1 AND T1.Technique='逃げ' THEN 1 ELSE 0 END) AS CountCourseNO1Nige,
    SUM(CASE WHEN T1.CourseNO=1 AND T1.Ranking<>1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO1Makurare,
    SUM(CASE WHEN T1.CourseNO=1 AND T1.Ranking<>1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO1Sasare,
    SUM(CASE WHEN T1.CourseNO=1 AND T1.Ranking<>1 AND T1.Technique='まくり差し' THEN 1 ELSE 0 END) AS CountCourseNO1Makurizasare,
    SUM(CASE WHEN T1.CourseNO=2 THEN 1 ELSE 0 END) AS CountCourseNO2,
    SUM(CASE WHEN T1.CourseNO=2 AND T1.Technique='逃げ' THEN 1 ELSE 0 END) AS CountCourseNO2Nigashi,
    SUM(CASE WHEN T1.CourseNO=2 AND T1.Ranking=1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO2Makuri,
    SUM(CASE WHEN T1.CourseNO=2 AND T1.Ranking=1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO2Sashi,
    SUM(CASE WHEN T1.CourseNO=3 THEN 1 ELSE 0 END) AS CountCourseNO3,
    SUM(CASE WHEN T1.CourseNO=3 AND T1.Ranking=1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO3Makuri,
    SUM(CASE WHEN T1.CourseNO=3 AND T1.Ranking=1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO3Sashi,
    SUM(CASE WHEN T1.CourseNO=3 AND T1.Ranking=1 AND T1.Technique='まくり差し' THEN 1 ELSE 0 END) AS CountCourseNO3Makurizashi,
    SUM(CASE WHEN T1.CourseNO=4 THEN 1 ELSE 0 END) AS CountCourseNO4,
    SUM(CASE WHEN T1.CourseNO=4 AND T1.Ranking=1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO4Makuri,
    SUM(CASE WHEN T1.CourseNO=4 AND T1.Ranking=1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO4Sashi,
    SUM(CASE WHEN T1.CourseNO=4 AND T1.Ranking=1 AND T1.Technique='まくり差し' THEN 1 ELSE 0 END) AS CountCourseNO4Makurizashi,
    SUM(CASE WHEN T1.CourseNO=5 THEN 1 ELSE 0 END) AS CountCourseNO5,
    SUM(CASE WHEN T1.CourseNO=5 AND T1.Ranking=1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO5Makuri,
    SUM(CASE WHEN T1.CourseNO=5 AND T1.Ranking=1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO5Sashi,
    SUM(CASE WHEN T1.CourseNO=5 AND T1.Ranking=1 AND T1.Technique='まくり差し' THEN 1 ELSE 0 END) AS CountCourseNO5Makurizashi,
    SUM(CASE WHEN T1.CourseNO=6 THEN 1 ELSE 0 END) AS CountCourseNO6,
    SUM(CASE WHEN T1.CourseNO=6 AND T1.Ranking=1 AND T1.Technique='まくり' THEN 1 ELSE 0 END) AS CountCourseNO6Makuri,
    SUM(CASE WHEN T1.CourseNO=6 AND T1.Ranking=1 AND T1.Technique='差し' THEN 1 ELSE 0 END) AS CountCourseNO6Sashi,
    SUM(CASE WHEN T1.CourseNO=6 AND T1.Ranking=1 AND T1.Technique='まくり差し' THEN 1 ELSE 0 END) AS CountCourseNO6Makurizashi
    FROM (
        SELECT 
        MRacer.RacerID AS RacerID,
        MRacer.Name AS Name,
        DCourse.CourseNO AS CourseNO,
        DResult.Ranking AS Ranking ,
        DResult.Technique AS Technique
        FROM MRacer
        INNER JOIN DCard
        ON MRacer.RacerID=DCard.RacerID
        INNER JOIN DCourse
        ON DCard.RaceDate=DCourse.RaceDate
        AND DCard.JoCD=DCourse.JoCD
        AND DCard.RaceNO=DCourse.RaceNO
        AND DCard.BoatNO=DCourse.BoatNO
        INNER JOIN DResult
        ON DCard.RaceDate=DResult.RaceDate
        AND DCard.JoCD=DResult.JoCD
        AND DCard.RaceNO=DResult.RaceNO
        AND DCard.BoatNO=DResult.BoatNO
        WHERE DCard.RaceDate>=p_RaceDateFrom
        AND DCard.RaceDate<=p_RaceDateTo
        ORDER BY RacerID
    ) AS T1
    GROUP BY T1.RacerID
) AS T2
まとめ
クエリを書いてボートレース新概念データを取得出来ました。
  
  
  
  
コメント