
導入記事にある通りエクセルの神髄さんのSQL基礎問題にチャレンジしていきます。
お題
1問目のお題はこちら
※P002の在庫数は200となっていますが、150で考えること
【SQL問題】※初級の上
— エクセルの神髄 (@yamaoka_ss) 2025年10月25日
「製品」テーブルに対して、製品IDが'P002'ではない製品の、最大在庫数を持つ製品の在庫金額(単価 * 在庫数)の合計を求めるSQL文を作成します。
SELECT SUM(単価 * 在庫数)
FROM 製品
WHERE (①)
①に入れるSQLを回答してください。
※結果は「2,250,000」です。 pic.twitter.com/3Lcvdx5PZR
言語化
SQLを書く前にまずは問題文からやるべき作業を抽出します。
- 製品IDがP002以外の最大在庫数 → 150(該当は製品IDがP003・P005)
- 該当製品の単価×在庫数を算出 → (5,000+10,000) × 150 =2,250,000
- 解答は2,250,000
実際に解答は2,250,000が正解となっています。
SQL化
在庫の最大値
まずは言語化1の「P002以外の最大在庫数」をSQLで表現します。
SQL文は下記のとおりです。
select max(在庫数) from [Q1$A1:D7] where 製品ID <> 'P002'
まずWhere句で製品IDがP002以外を抽出します。
下図では右端のWhere句が判定結果になります。
ここがTRUEのもののみが次のステップに進みます。

次にWhere句がTRUEのもののなかから在庫数の最大値を抽出します。
2つありますが解答としては150となります。
在庫金額
次に在庫数が150の製品の単価×在庫数計算します。
select sum(単価 * 在庫数) as 合計 from [Q1$A1:D7] where 製品ID <> 'P002' and 在庫数 = 150
Where句には2つの条件が設定されています。
1つは先程算出した最大在庫数150と一致する在庫数。
もう1つは製品IDがP002以外となります。
在庫の最大値を算出するSQLで既にP002以外の条件としていたのになぜ在庫金額を算出するSQLでもこの条件が必要になるのでしょうか。
条件を在庫数=150のみにしてしまうと、今回除外すべき製品IDP002の在庫数が150のため計算対象となってしまいます。そのため再度製品IDがP002を除外する条件を設定しています。

この2つの条件をANDで満たす、つまり両方の条件を満たすもののみが抽出対象になります。
今回の例ではP003とP005が対象となります。
あとは製品IDがP003とP005の在庫金額を「select sum(単価 * 在庫数) as 合計 (単価 * 在庫数)」
のSQL文で算出すれば完了です。
最後に2つのSQL文を1つにまとめて完成です。
select sum(単価 * 在庫数) as 合計 from [Q1$A1:D7] where 製品ID <> 'P002' and 在庫数 = ( select max(在庫数) from [Q1$A1:D7] where 製品ID <> 'P002' )
まとめ
このくらいの条件であれば、スピル関数が使えるようになっている現在では関数だけで抽出することも十分可能です。
しかしSQLの強みの一つは【頭で考えたデータ集計を思ったままにコードにできる】ことだと思います。
是非チャレンジしてみてください