基本情報23年特別 午後 問5

【問題を解く前に】
 簡単そうな問題ですが、本当に簡単なのか、落とし穴にはまっていて簡単なのかが、問題となる設問です。

まず、問題を整理すると・・・

応募券と招待券を郵送するために、あて先を出すプログラムの話。

期間中(5月10日〜6月20日*)に

 応募券は、対象商品(A001〜A199)を買った人に対し購入個数分(*)
 招待券は、期間の合計金額5万円以上の人に1枚(*)

送る。宛名は、1顧客に対し1つだす(応募券と招待券両方出すだけでも1つ)

というようにまとめられます。

*が落とし穴!どう落とし穴なの?・・・

こういうときの受験テクニックは、具体的に値を見ていくことでした。
なので、表2で考えて見ましょう。


<<落とし穴1:期間>>
 期間が決まっていました。5月10日から、6月20日までです。
 つまり、一番初めの5月8日のレコードと、一番最後の6月21日のレコード、
7月16日の081番さんのレコードは入りません。
もう、線で消しておいて置きましょう。紛らわしいです。


<<落とし穴2:発行枚数>>
 応募券は、購入個数分発行されます。

 たとえば、2番目のレコード、5月25日に、001番さんは、対象商品A180を
8個買っていますので、「8枚」発行されます。1枚ではありません。

 一方、招待券は、合計金額です。
 081さんは何回も50000円以上の買い物をしていますが、
 もらえる券は1人1枚なので、1枚です。


 これをもとに、顧客ごとにまとめると

001番は、応募券○(A180)、招待券×(44000)
002番は、応募券×(BXXX)、招待券×(25000+20000)
005番は、応募券○(A007)、招待券○(50000)
010番は、応募券×(BXXX)、招待券○(45000+60000)
081番は、応募券○(A006)、招待券○(52000+60000+20000)
258番は、応募券×(BXXX)、招待券×(2500)
386番は、応募券○(BXXX)、招待券×(25000+20000)

結局、送るのは、どちらかに丸が付いている
001、005、010、081、386の5人
となります。これを元に、といていきます。


【解き方】

設問1
a)について
 図3の流れ図にあります。
 つまり、招待券処理をする条件(=招待券発行条件)ということになります。
 
 これは、購入金額合計が50000円以上ということでした。

b)について
 まず、ア、イについては、レコード1行の購入金額をみていますが、
 上記の386さんのように、2行以上見ないとわからないケースがあるので、
 1行しか見ないで答えることはできません。なので、ア、イ、キ、クはない。

 そうすると、応募券枚数>0または招待券枚数>0ということになります
 (どちらか一方でも1以上だと、郵送しないといけないので、宛名がいる)

設問2
 応募券は、購入個数ごとに発行するのですから、購入個数を足していないとおかしいです。なので、いままでの応募券枚数に購入個数を足していく形になります。

設問3
c)について
 上の顧客ごとの表を見てください。招待券に○がついているのは3人

d)について
 上記のとおり、送るのは5人


【答え】

設問1
  a  ウ
  b  カ
設問2 オ
設問3 
c  ウ
d  ウ

【解き終わって】

じゃあ、この問題、落とし穴とかあって、引っ掛け問題なのか?
というと、そうかもしれないけど、たぶん、違うと思います。
この問題で問いたいことは、招待券と応募券のように、コントロール
ブレークが違うときに、どう処理するのが簡単かということに気づかせたい
んだとおもいます。

 その場合には、今回の例にあるように分けてしまったほうが楽です。
 SQLでやるときも、1本のSQLで書くのではなく、顧客ごとに
   招待券の数を求めるビューと
   応募券を求めるビューをつくって、
 それに対して、宛名処理を行ったほうが楽です。

 さすがに問題にそうは直接かけないので、
 それに気づかせるように書いたら、
 引っ掛け問題のようになってしまったということではないかな?
 と妄想しています。