平成29年度 春期 午前Ⅱ 問2
データ操作
集約関数に関する問題
図のデータモデルは会計取引の仕訳を表現している。“移動”がリンクする“勘定”の残高を増やす場合は金額の符号を正に,減らす場合は負にすることで,貸借平均の原理を表現する。このモデルに基づき,“勘定”表,“会計取引”表,“移動”表を定義した。勘定科目“現金”の2017年4月30日における残高を導出するためのSQL文はどれか。ここで,モデルの表記にはUMLを用い,表中の実線の下線は主キーを表す。また,“会計取引”表には今期分のデータだけが保持される。
データモデル:
[勘定] 勘定科目/期首残高//残高 2..* ──────────── * [会計取引] 取引番号/取引日
┆(点線で関連クラスが付く)
[移動] 金額
[会計取引]に点線で付いた注記:制約:一つの会計取引につながる移動の金額の和はゼロであること。
勘定(勘定科目,期首残高)
会計取引(取引番号,取引日)
移動(勘定科目,取引番号,金額)
- アSELECT SUM(金額) AS 残高 FROM 勘定, 移動, 会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 会計取引.取引番号 = 移動.取引番号 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2017-04-30'
- イSELECT 期首残高 + SUM(金額) AS 残高 FROM 勘定, 移動, 会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 会計取引.取引番号 = 移動.取引番号 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2017-04-30' GROUP BY 勘定.勘定科目, 期首残高
- ウSELECT 残高 FROM 勘定, 移動, 会計取引 WHERE 勘定.勘定科目 = '現金' AND 取引日 <= '2017-04-30'
- エSELECT 残高 FROM 勘定, 移動, 会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2017-04-30'
答えと解説を見る
✓ これが正解イSELECT 期首残高 + SUM(金額) AS 残高 FROM 勘定, 移動, 会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 会計取引.取引番号 = 移動.取引番号 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2017-04-30' GROUP BY 勘定.勘定科目, 期首残高
解説
期首残高に4月30日までの移動の金額の合計を足すSQL文です。
見分ける軸は、残高がどの表のどの列から求まるかです。モデルの残高には斜線が付いており、ほかの値から導く属性です。実際の勘定表の列は勘定科目と期首残高だけで、残高という列はありません。そこで、ある日の残高は、期首残高に、その日までの取引で生じた移動の金額を足して求めます。正解のSQL文は、勘定・移動・会計取引の3表を勘定科目と取引番号で結合し、勘定科目を現金に、取引日を2017年4月30日以前に絞ってから、期首残高+SUM(金額)を計算しています。期首残高は集約関数の外にある列なので、勘定科目と期首残高でGROUP BYしてから並べています。会計取引表には今期分だけがあるので、期首からの増減をそのまま足せます。導出属性は列として存在しない、と押さえるのが見分け方です。
ほかの選択肢はなぜ違うのか
- アSELECT SUM(金額) AS 残高…:移動の金額を合計しているだけで、期首残高を足していません。今期分の増減の合計は求まりますが、期首にあった現金の額が抜けるので、4月30日時点の残高にはなりません。
- ウSELECT 残高 FROM 勘定, 移…:残高という列は勘定表に定義されていないので、この列を選ぶことはできません。加えて、3つの表を結ぶ結合条件が一つも書かれておらず、表どうしの組合せがすべて作られてしまいます。
- エSELECT 残高 FROM 勘定, 移…:勘定表と移動表は結んでいますが、会計取引表との結合条件が抜けています。何より、モデルで導出属性とされた残高は勘定表の列として定義されていないため、そのまま取り出せません。
この問題の用語
- 会計お金の動きを記録し、まとめて報告する仕事のことをいいます。在庫の評価のしかたなど、決められた方法に従って計算します。
出典:平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問2
同じ用語が出る問題
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)