Access学習メモ 7-11. SQL基礎学習⑪

Access学習メモ 7-11. SQL基礎学習⑪

コンテンツ
学び

INNER JOIN句を用いた検算方法(請求書)

管理職の代理で、請求書の内容チェック~決裁をおこなう必要が生じた。
私の人生にAccessは必要ない...と断言して早1ヶ月。
電卓を叩く工程だけでもAccessに任せられないものか、画面と睨めっこ中。

方法を調べる内、これまで取り組んできたINNER JOINの学習が活かせる可能性が生じた。
別々のオブジェクト(テーブルやクエリ)に存在する同一データのレコード(行)を探し当て
各オブジェクトの列(フィールド)をあたかもひとつのオブジェクト上のデータのように繋ぎ合わせることができる。

ココナラのユーザー登録を例に挙げると...
(会員IDを各テーブルの仲介役と仮定)
テーブル1: ココナラ登録会員リスト
テーブル2: ココナラブログ投稿歴のある会員リスト
テーブル3: ココナラサービス出品歴のある会員リスト
テーブル4: ココナラサービス購入歴のある会員リスト

それぞれのテーブルに、各条件を満たす会員IDが格納された状況下において
「ココナラに会員登録している」
かつ「ココナラブログを1度でも書いたことがある」
かつ「ココナラで何らかの商品を出品したことがある」
かつ「ココナラで何らかの商品を購入したことがある」

INNER JOIN句を用いたSQLにより命令を与えることで、
テーブル別に分類された上記条件をすべて満たす会員データを抽出することも可能。

INNER JOIN句のこうした働きを応用することで、
日頃は別々に運用されているテーブル同士またはテーブルをもとに作成されたクエリ同士を呼び集め
一定の条件下における演算にも展開できる・・・はず。
社内情報を社外に持ち出すわけにいかず、再びココナラを例に挙げて考える。

出品の経験がないため、ルールなど詳しいことはよく分からないが
出品者が自らの成果物に対し、販売価格を検討する際には
完成までにかかる経費や作業工数などを予測し
損益分岐点を下回らない程度の最低料金を下限として設定し
相応しい数字へと調整を行うのが自然な流れではと思う。

その考え方に基づき、リレー形式でクエリ(SQL)を組み請求金額を導き出してみる。
【例】
80円の商品を30こ販売しました。
制作のための所要時間は3時間。時給は1,000円。追加経費も少々。
この場合、請求価格として採用されるのは
単価と販売実績に基づく売上高か?
時給に基づく最低料金か?
Accessは正しく導き出してくれるでしょうか?

~①商品単価と販売件数に応じた売上高と②最低料金を算出~
① 販売額を計算
T_販売明細テーブル(テーブル = データを保存する場所)
T_販売明細.png

販売単価*販売件数
Q1_販売額集計クエリ(クエリ = テーブル上のデータを使って計算する場所)
Q1.png

② 最低料金を計算
T_最低料金テーブル(テーブル = データを保存する場所)
T_最低料金.png

料金単価*作業工数
Q2_最低料金集計クエリ(クエリ = テーブル上のデータを使って計算する場所)
Q2.png

~③:①②の算定結果を比べる~
Q1とQ2で、Job番号が同じレコード同士を結合(INNER JOIN)し、その後IIf関数で比較
Q3修正.png

【ポイント】
今回のINNER JOINは、
一般的に説明される「両テーブルに存在するデータ抽出」用途とは異なり、
比較対象となる①販売額と②最低料金を並列させることが目的である。

また、Job番号は現在、3レコードまで登録されているが
すべて情報が出揃っているJob番号01が今回の請求対象と判断される。

Q1.販売額の集計結果、
Q2.最低料金の集計結果のうち、
両方に存在するJob番号のデータだけを取り出し、
比較対象であるQ1とQ2を一覧化するために
INNER JOINを使用する。

~④:③で比較した①と②の計算結果の内、大きい数字の計算結果を価格として採用~
そして
~⑤:諸費用[追加料金]や[経費]があれば④に加算する~
T_諸費用.png

Q3_採用価格判定SQL
SELECT
    Q1.[Job番号],
    Q1.[販売額],
    Q2.[最低料金],
    IIf(Q1.[販売額] > Q2.[最低料金], Q1.[販売額], Q2.[最低料金]) AS 採用価格,
    T_諸費用.[追加料金],
    T_諸費用.[経費]
FROM
    (
        Q1_販売額集計 AS Q1
        INNER JOIN Q2_最低料金集計 AS Q2 ON Q1.[Job番号] = Q2.[Job番号]
    )
    INNER JOIN T_諸費用 ON Q2.Job番号 = T_諸費用.Job番号;

~⑥:⑤の算定結果をもって請求額の確定~
Q4.png

Q4_採用価格(請求額)計算
SELECT
    Q3_採用価格判定.[Job番号],
    Q3_採用価格判定.[採用価格],
    Q3_採用価格判定.[追加料金],
    Q3_採用価格判定.[経費],
    [Q3_採用価格判定].[採用価格] + Nz ([追加料金], 0) + Nz ([経費], 0) AS 請求額
FROM
    Q3_採用価格判定;

【注意点】
SELECT句では、表示するフィールドや計算項目をカンマで区切ります。
IIf関数の構造
第1引数 条件式 , ←語尾にカンマ
第2引数 条件が真(TrueつまりYes)のとき , ←語尾にカンマ
第3引数 条件が偽(FalseつまりNo)のとき  ←カンマは不要

クエリをまとめることもできなくはないが
敢えて計算過程を段階ごとに区切った方が、間違い探しには役立つ。

今回の例では、最低料金にて請求額を確定いたしました。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す