【応用情報】令和7年度春期(午後:問6 データベース)第3回 - SQL(その2)
今回も、令和7年度春期応用情報技術者試験の午後問6「データベース」 について解説します。
前回の続きとなっておりますので、まだご覧になられていない場合はまずこちらからどうぞ。
【応用情報】令和7年度春期(午後:問6 データベース)第1回 - ER図
【応用情報】令和7年度春期(午後:問6 データベース)第2回 - SQL(その1)
この記事は、下記の方々を対象としております。
- 応用情報技術者試験を受験する、且つ午後にデータベースを選択する。
- データベーススペシャリスト試験を受験するが、応用情報レベルから復習したい。
- 開発エンジニアでデータモデリングやDB関連の設計を担当する、もしくは目指している。
試験問題の構成や難易度、SQLや設計のポイントを整理しました。
下記の内容を全4回に分けてご紹介しています。
- 第1回:設問1(ER図 - 複合主キー)
- 第2回:設問2(SQL - 結合と集計)
- 第3回:設問3(今回)(SQL - ソートと条件考察)
- 第4回:設問4(テーブル定義の変更)
設問3:ソート順と条件考察
前回に続き、SQL文の穴埋めで空欄は『f』『g』の2つです。
ここでは順番が前後しますが、下記の理由により難易度の易しい順 『g』→『f』で解説します。
- gは、問われている図の意味と、いわゆる『SQLのお作法』のようなものを知っていれば、迷うことなく解答できるため
- fは、問題文をフル活用してER図や仕様説明も読み解くことが必須であるため
- 上記2点より、ページを遡って読む必要がある分『f』の方が『g』よりやや難しいと判断したため
※出典:令和7年度 春期 応用情報技術者試験 午後 問題冊子
集計結果の降順とする(空欄:g)
まず、SQL文が図の説明に書いてあることを満たしていない点に気付いたでしょうか?
ここは素直に、図の説明をそのままSQL文で書いて空欄gを埋めます。
空欄gは『ORDER BY 売上実績数 DESC』 です。
送付エリアの見直しによる条件指定(空欄:f)
段落とその冒頭に『葉書を送るエリア』と記載がありますが、SQL文ではエリアが条件に指定されていない点に気付いたでしょうか?
気付いてしまえば、話は早いです!
あとは、どうやってそれをSQLで表現するかを考えます。
売上テーブルを使っていますが、キャンペーン種別があります。
種別の内訳は、表で説明されています。葉書は『H』で表します。
これを、WHERE条件に続けて記載すれば良いのです。
空欄fは『AND U.キャンペーン種別 = 'H'』 です。
葉書に限定するので、他の条件と一緒にする際は必ず『AND』で指定する点も理解しましょう。
これにより、葉書以外のキャンペーン種別(メールやバナー広告など)が除外され、正確な集計が可能になります。
SQLを動かしてみよう
解説はしたものの、簡単に試せるのなら試した方が良いです!
PostgreSQLで書きますので、よろしければ試してみてください。
※簡単に試す方法はこちらの記事を参考にして下さい。
データサンプル
問題文には具体的なデータが無いので、私が考えたオリジナルをご紹介します。
まず、テーブル定義とデータです。
-- 会員テーブル
CREATE TABLE 会員 (
会員番号 CHAR(4) PRIMARY KEY
, 会員郵便番号 CHAR(7)
);
INSERT INTO 会員 VALUES
('KA01',0230011)
,('KA02',0150001)
;
-- 売上テーブル
CREATE TABLE 売上 (
売上番号 CHAR(4) PRIMARY KEY
, 店舗番号 CHAR(4)
, 売上年月日 DATE
, 会員番号 CHAR(4)
, キャンペーン番号 CHAR(4)
, キャンペーン種別 CHAR(1)
);
INSERT INTO 売上 VALUES
('U101','T111','2025/07/01','KA01','CP01','H')
,('U102','T111','2025/07/01','KA01','CP01','L')
,('U103','T222','2025/07/01','KA02','CP02','H')
,('U104','T222','2025/06/01','KA02','CP02','H')
,('U105','T222','2025/07/01','KA02','CP02','H')
,('U106','T222','2025/07/01','KA02','CP02','B')
,('U107','T222','2025/07/01','KA01','CP99','H')
;
問題文のSQL完成版
パラメータで指定する店舗番号や売上年月日は、変えて試してみてください。
SELECT
K.会員郵便番号
,COUNT(*) AS 売上実績数
FROM 売上 U
INNER JOIN 会員 K ON U.会員番号 = K.会員番号
WHERE U.店舗番号 = 'T222' -- パラメータで指定する項目
AND U.売上年月日 >= '2025/07/01' -- パラメータで指定する項目
AND U.キャンペーン種別 = 'H'
GROUP BY K.会員郵便番号
ORDER BY 売上実績数 DESC
;
さいごに
これで、設問3は終わりです。
前回と同じことですが、問題文の全体ではなくポイントだけ紹介しているので、分かり辛いところもあるかもしれません。
下記のコンテンツを合わせてご利用いただくことで、更に理解が深まると思います。
- IPAの過去問を見ながら、本記事を読む。
- 私の個人YouTubeの過去問解説をご視聴いただく(※毎回プレビュー載せるのも何なので、今回はリンクのみ)
- 本記事でご紹介したSQLを動かしてみる。
次回はテーブル定義の変更ですが、またSQLを書くと思います。
ここまでお付き合い頂き、ありがとうございましたm(_ _)m
Discussion