1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLパズル55 競走馬の入賞回数 の 解法3の学習メモ

Last updated at Posted at 2024-11-20

概要

SQLパズル p230 55 競走馬の入賞回数 の 解法3の学習メモです。

内容は、サブクエリ使っているだけですね。
理解しやすい解法でした。

要件

3つのカラムから集計値を求める。

今回の場合だと、3つのカラムwin_name,place_name,show_nameがある。
3つのカラムとも馬の名前が入っており 3つのカラムに対して馬の名前の集計値を取得したい。

image.png

SQL

DDL

--  p228 55 競走馬の入賞回数
DROP TABLE IF EXISTS RacingResults;
CREATE TABLE RacingResults
(track_id CHAR(3) NOT NULL,
 race_date DATE NOT NULL,
 race_nbr INTEGER NOT NULL,
 win_name CHAR(30) NOT NULL,
 place_name CHAR(30) NOT NULL,
 show_name CHAR(30) NOT NULL,
    PRIMARY KEY (track_id, race_date, race_nbr));

DROP TABLE IF EXISTS HorseNames;
CREATE TABLE HorseNames
(horse CHAR(30) NOT NULL PRIMARY KEY);

INSERT INTO RacingResults VALUES(1, '2007-05-01', 1, 'A', 'B', 'C');
INSERT INTO RacingResults VALUES(1, '2007-05-01', 2, 'E', 'F', 'P');
INSERT INTO RacingResults VALUES(1, '2007-05-02', 1, 'B', 'C', 'A');
INSERT INTO RacingResults VALUES(2, '2007-05-02', 1, 'O', 'P', 'Q');
INSERT INTO RacingResults VALUES(2, '2007-05-02', 2, 'A', 'P', 'Q');

INSERT INTO HorseNames VALUES('A');
INSERT INTO HorseNames VALUES('B');
INSERT INTO HorseNames VALUES('C');
INSERT INTO HorseNames VALUES('D');
INSERT INTO HorseNames VALUES('E');
INSERT INTO HorseNames VALUES('F');
INSERT INTO HorseNames VALUES('O');
INSERT INTO HorseNames VALUES('P');
INSERT INTO HorseNames VALUES('Q');

答えのSQL

-- 55 競走馬の入賞回数 その3 p230
SELECT H1.horse,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse)
    FROM HOrseNames AS H1;

-- 途中式 各々の項目を表示するだけ
SELECT H1.horse,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse) as C1,
      (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse) as C2,
       (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse) as C3,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse)
    FROM HOrseNames AS H1;

image.png

参考

SQLパズル p230

SQLパズル サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p55

達人に学ぶSQL徹底指南書第2版 該当する場所なし。

github差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/5e06eb1fcf0548c87e4560d340eddc7556ca136d

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?