コース一覧
SQL道場 図書館DBに挑む10問
総合 月次利用レポート

SQL道場 図書館DBに挑む10問

SQL入門で身に付けた技を、初見の図書館データベースで試す演習専用コースです。解説はありません。お題と完成条件だけを読み、白紙から自分でクエリを組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。条件検索から始まり、集計、結合、副問い合わせ、トランザクション、テーブル設計を経て、最後は CTE を使った月次レポートまで、10問で SQL の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。SQL入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
初段
01. 蔵書を条件で探せ15分
02. 人気の本TOP515分
03. 貸出中の冊数は?15分
04. ジャンル別の蔵書数20分
2
中段
01. 誰が何を借りている?25分
02. 一度も借りられていない本25分
03. 平均より人気の本30分
04. 返却処理を安全に30分
3
師範
01. 予約テーブルを設計せよ35分
02. 総合 月次利用レポート45分

総合 月次利用レポート

師範 / 目安 45分

年度の報告書に載せる月次の利用レポートを作ります。理事会に出す数字なので、月が飛んでも読めるように、貸出のあった月だけを並べます。

必要なのは月ごとの貸出件数と、その月に実際に借りた人の数です。同じ人が月に3回借りても、利用者数としては1人と数えます。ここを間違えると数字が水増しされます。

完成条件

月ごとに、貸出件数と利用者数を集計してください。

  • 出す列は month、loan_count、member_count の3つ
  • month は 2026-01 のような文字列
  • member_count は同じ人を重複して数えない
  • 並びは month の昇順
  • 途中の集計は WITH で名前を付けて組み立てる

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。

日付をそのまま出すと表記が環境で変わります。文字列に直してから出してください。

テーブル構造

CREATE TABLE members ( id integer PRIMARY KEY, name text NOT NULL, joined_on date NOT NULL, plan text NOT NULL ); CREATE TABLE books ( id integer PRIMARY KEY, title text NOT NULL, author text NOT NULL, genre text NOT NULL, published_year integer NOT NULL, price integer NOT NULL ); CREATE TABLE loans ( id integer PRIMARY KEY, book_id integer NOT NULL REFERENCES books (id), member_id integer NOT NULL REFERENCES members (id), borrowed_on date NOT NULL, returned_on date ); INSERT INTO members VALUES (1, '田中あかり', DATE '2024-04-01', '一般'), (2, '佐藤けんじ', DATE '2024-06-15', '一般'), (3, '鈴木みゆき', DATE '2025-01-20', '学生'), (4, '高橋なおと', DATE '2025-03-05', '学生'), (5, '伊藤さくら', DATE '2025-08-11', '一般'), (6, '渡辺ゆうた', DATE '2026-02-01', '一般'); INSERT INTO books VALUES (1, '銀河の設計図', '星野りく', 'SF', 2019, 1800), (2, '沈黙の実験室', '星野りく', 'SF', 2021, 2200), (3, '夜明けのレシピ', '森田はるか', '料理', 2020, 1500), (4, '家庭料理の教科書', '森田はるか', '料理', 2018, 2800), (5, 'やさしい統計入門', '大村しんじ', '技術', 2022, 3200), (6, 'データベース実践', '大村しんじ', '技術', 2023, 3600), (7, '山と湖の記録', '川瀬あおい', '生活', 2017, 1600), (8, '北の島へ', '川瀬あおい', '生活', 2021, 1900), (9, '猫と暮らす', '林ももこ', '生活', 2024, 1400), (10, '小さな庭の作り方', '林ももこ', '生活', 2022, 1700), (11, '消えた手紙', '星野りく', 'SF', 2016, 1300), (12, '三日月の約束', '藤田けい', 'ミステリ', 2025, 2000), (13, '軌道の彼方', '星野りく', 'SF', 2024, 2400), (14, 'ネットワーク入門', '大村しんじ', '技術', 2020, 2900), (15, '朝のパン作り', '林ももこ', '生活', 2023, 1600); INSERT INTO loans VALUES (1, 1, 1, DATE '2026-01-05', DATE '2026-01-19'), (2, 1, 2, DATE '2026-01-12', DATE '2026-01-26'), (3, 1, 3, DATE '2026-02-03', DATE '2026-02-17'), (4, 1, 4, DATE '2026-03-09', DATE '2026-03-23'), (5, 1, 5, DATE '2026-04-06', DATE '2026-04-20'), (6, 1, 6, DATE '2026-05-11', NULL), (7, 9, 1, DATE '2026-01-08', DATE '2026-01-22'), (8, 9, 2, DATE '2026-02-10', DATE '2026-02-24'), (9, 9, 3, DATE '2026-03-02', DATE '2026-03-16'), (10, 9, 4, DATE '2026-04-13', DATE '2026-04-27'), (11, 9, 5, DATE '2026-05-18', NULL), (12, 5, 1, DATE '2026-02-16', DATE '2026-03-02'), (13, 5, 3, DATE '2026-03-23', DATE '2026-04-06'), (14, 5, 4, DATE '2026-04-20', DATE '2026-05-04'), (15, 5, 6, DATE '2026-06-01', NULL), (16, 3, 2, DATE '2026-01-19', DATE '2026-02-02'), (17, 3, 5, DATE '2026-03-16', DATE '2026-03-30'), (18, 3, 6, DATE '2026-05-25', NULL), (19, 12, 1, DATE '2026-04-27', DATE '2026-05-11'), (20, 12, 3, DATE '2026-06-08', NULL), (21, 2, 2, DATE '2026-02-23', DATE '2026-03-09'), (22, 7, 4, DATE '2026-05-04', DATE '2026-05-18'), (23, 13, 5, DATE '2026-06-15', DATE '2026-06-29');

期待される出力

monthloan_countmember_count
2026-0142
2026-0243
2026-0343
2026-0443
2026-0543
2026-0633

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 まず貸出に「月」の列を足した中間表を作り、それを月でまとめます

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...