基本情報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で書くのではなく、顧客ごとに
招待券の数を求めるビューと
応募券を求めるビューをつくって、
それに対して、宛名処理を行ったほうが楽です。
さすがに問題にそうは直接かけないので、
それに気づかせるように書いたら、
引っ掛け問題のようになってしまったということではないかな?
と妄想しています。