コマンド道場
日付関数難易度 ★★★★

年月ごとの受注件数と売上

取消されていない受注(status が 'done')を年月ごとに集計してください。列は「年, 月, 受注件数, 売上合計」の順です。受注件数は受注の件数(明細の行数ではありません)、売上合計は 数量 × 単価 の合計です。年、月の順に古いものから並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / Oracle Database

  • SQLite では使えませんEXTRACT(日付の一部を取り出す)
  • SQL Server では使えませんEXTRACT(日付の一部を取り出す)

未確認: IBM Db2

製品ごとの対応表(実測)を見る

  • EXTRACT(YEAR FROM 日付) が使えない製品があります。SQLite では strftime('%Y', 日付)、SQL Server では YEAR(日付) または DATEPART(year, 日付) と書きます。
  • 日付の扱いは製品差がもっとも大きい領域です。年や月を取り出すときは、まず手元の製品での関数名を確かめてください。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

10

NULL
🔑int不可
int不可
date不可
text不可
データを見る(先頭 5 行)
juchu_idkokyaku_idjuchu_onstatus
100112025-11-05done
100222025-11-18done
100312025-12-02done
100432025-12-09cancel
100542025-12-24done

17

NULL
🔑int不可
🔑int不可
int不可
int不可
numeric(10,0)不可
データを見る(先頭 5 行)
juchu_idgyo_noshohin_idsuryotanka
10011120180
10012230120
100214223800
100225118500
10031644200

5

NULL
🔑int不可
text不可
text
date不可
データを見る(先頭 5 行)
kokyaku_idkokyaku_nameprefcreated_on
1青葉工業東京都2024-05-10
2白樺物産大阪府2024-08-01
3黒松システム東京都2025-01-15
4赤坂商会NULL2025-03-20
5三田商事愛知県2025-06-01

7

NULL
🔑int不可
text不可
text不可
numeric(10,0)不可
データを見る(先頭 5 行)
shohin_idshohin_namecategoryprice
1ノート文具180
2ボールペン文具120
3付箋文具250
4デスクチェア家具24800
5書棚家具18500

解説

結論

EXTRACT(YEAR FROM 列) / EXTRACT(MONTH FROM 列) で年と月を取り出し、その 2 つで GROUP BY します。

★年でまとめずに月だけでまとめると、2025 年 2 月と 2026 年 2 月が 1 行に混ざります。このデータは 4 か月にまたがっているので、年をまとめのキーに入れたかどうかが結果に現れます。月次の集計で年を入れ忘れるのは実務でも起きる事故です。

★件数の数え方

juchu と juchu_meisai を結合した時点で、明細が 2 行ある受注は 2 行になります。この状態で count(*) を書くと明細の行数を数えることになり、「受注件数」ではありません。受注の件数を数えたいなら count(DISTINCT juchu_id) です。一方、売上は明細ごとの金額を足したいので sum のままで正しくなります。「結合したことで何が増えたか」を意識してください。

★どの単価を使うか

このデータでは、明細の tanka(受注時点の単価)と shohin.price(現在の定価)がわざと食い違っています。売上のように「そのとき実際にいくらだったか」を知りたい集計では、受注時点の単価を使います。マスタの定価を使うと、値上げや値引きのぶんだけ過去の売上が書き換わってしまいます。

⚠️ 日付関数は製品差が大きい領域です。EXTRACT は標準 SQL の書き方ですが、SQLite と SQL Server では使えません(実測)。移植の可能性がある処理では、日付の加工をアプリケーション側に寄せる、という判断もあります。

よくある間違い

①count(*) で明細の行数を数える。②年をまとめのキーに入れ忘れる。③GROUP BY に書く式と SELECT に書く式が食い違ってエラーになる。

根拠(一次情報)