平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問2
テクノロジ/データベース図のデータモデルは会計取引の仕訳を表現している。“移動”がリンクする“勘定”の残高を増やす場合は金額の符号を正に,減らす場合は負にすることで,貸借平均の原理を表現する。このモデルに基づき,“勘定”表,“会計取引”表,“移動”表を定義した。勘定科目“現金”の2015年4月30日における残高を導出するためのSQL文はどれか。ここで,モデルの表記にはUMLを用い,表中の実線の下線は主キーを表す。また,“会計取引”表には今期分のデータだけが保持される。 〔データモデルの概要〕 “勘定”(勘定科目,期首残高,/残高)と“会計取引”(取引番号,取引日)は,“移動”(勘定科目,取引番号,金額)を介して関連付けられる。“勘定”側の多重度は2..*,“会計取引”側の多重度は*である(一つの勘定は二つ以上の会計取引の移動に対応し,一つの会計取引には複数の勘定への移動が対応する)。制約:一つの会計取引につながる移動の金額の和はゼロであること。 〔表定義〕 勘定(勘定科目,期首残高) 会計取引(取引番号,取引日) 移動(勘定科目,取引番号,金額) (注:本サイトでは原問題の図を文字表記に変換しています)
出典:平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問2
- アSELECT SUM(金額) AS 残高 FROM 勘定,移動,会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 会計取引.取引番号 = 移動.取引番号 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2015-04-30'
- イSELECT 期首残高 + SUM(金額) AS 残高 FROM 勘定,移動,会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 会計取引.取引番号 = 移動.取引番号 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2015-04-30' GROUP BY 勘定.勘定科目, 期首残高
- ウSELECT 残高 FROM 勘定,移動,会計取引 WHERE 勘定.勘定科目 = '現金' AND 取引日 <= '2015-04-30'
- エSELECT 残高 FROM 勘定,移動,会計取引 WHERE 勘定.勘定科目 = 移動.勘定科目 AND 勘定.勘定科目 = '現金' AND 取引日 <= '2015-04-30'
正解:イ
解説
“移動”は,ある会計取引によってある勘定の残高が変化したことを表す関連クラスであり,その金額の符号によって残高の増減(借方・貸方)を表現する。勘定“現金”のある時点での残高は,期首残高に,その時点までに生じた“移動”の金額(現金に対する移動)を全て合算すれば求められる。“会計取引”表には今期分のデータしか保持されていないため,期首残高(前期末までの累計)に,今期分の移動額の合計を加える必要がある。したがって,勘定.勘定科目='現金'に対応する移動の金額のうち,取引日が2015-04-30以前のものをSUM(金額)で合計し,期首残高に加算するSQL文が正しい。
選択肢ごとの解説
- ア誤り。SUM(金額)だけを残高としており,期首残高が加算されていない。“会計取引”表には今期分のデータしかないため,期首残高を加えなければ2015年4月30日時点の正しい残高にならない。
- イ正しい。期首残高に,今期分の“現金”に関する移動の金額(取引日が2015-04-30以前のもの)の合計を加えることで,2015年4月30日時点の残高を正しく導出できる。GROUP BYでSUM関数と非集計列(期首残高)を整合させている。
- ウ誤り。“残高”という列は“勘定”表に定義された導出属性(/残高)であり,実表としては存在しないため,そのままSELECTでは取得できない。SUM関数などを用いて移動額から計算する必要がある。
- エ誤り。ウと同様に,実表に存在しない“残高”列をそのままSELECTしており,SUM関数による集計が行われていないため,残高を求めることができない。