Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

SQL基礎問題1:最大在庫数を持つ製品の在庫金額


導入記事にある通りエクセルの神髄さんのSQL基礎問題にチャレンジしていきます。

www.excellovers.com

ExcelSQLを使う方法については上記を参照。

お題

1問目のお題はこちら
※P002の在庫数は200となっていますが、150で考えること


言語化

SQLを書く前にまずは問題文からやるべき作業を抽出します。

  1. 製品IDがP002以外の最大在庫数 → 150(該当は製品IDがP003・P005)
  2. 該当製品の単価×在庫数を算出 → (5,000+10,000) × 150 =2,250,000
  3. 解答は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の強みの一つは【頭で考えたデータ集計を思ったままにコードにできる】ことだと思います。

是非チャレンジしてみてください