Microsoft Access 掲示板

条件付きのクエリ作成について / 6

15 コメント
views
6
しおこんぶ 2025/01/21 (火) 10:31:48 a6738@80964

返信ありがとうございます。

Qプラス400円になる資格の組み合わせは下記の5パターンということでしょうか。
資格CD1,2,3
資格CD4,5,6
資格CD7,8,9
資格CD10,11,12
資格CD13,14,15

→はい、5パターンです。

Q一人の作業員が2パターン以上の資格を持っている場合は、それぞれのパターン毎にプラス400円になるのでしょうか。
→はい、パターン毎にプラス400円です。

Q資格CD1,2,3,4,5,6を持っていたらプラス800円になるのでしょうか。
→はい、作用員一人に対して1パターンにつきプラス400円なので、2パターンなら800円、3パターンなら1200円追加されます。

不慣れで見にくい返信で申し訳ございませんでした。
以下の表で少し見やすいでしょうか・・・?

作業員CD資格CD金額
111,200
121,600
131,600
141,200
151,600
161,600
271,200
281,600
291,600
2101,200
2111,600
311,200
321,600
471,200
491,600

結果

作業員CD金額
19,600
27,600
32,800
42,800

Qまた、結果はクエリとして一覧表示したいのでしょうか。
 それとも現状のメインサブフォームで表示出来ればいいのでしょうか。
 →メインサブフォームで表示できればうれしいです。

参照ページの添付までありがとうございます。
これからも精進してまいりますので、よろしくお願いいたします。

通報 ...
  • 7

    …資格が70件ほどあり、全ての資格ではなく一部の資格でして…

    Qプラス400円になる資格の組み合わせは下記の5パターンということでしょうか。
     →はい、5パターンです。

    対象となる資格やパターンの可視化、及び パターンの増減に対応するため
    別途、パターンの管理テーブルを作成しましょう

    t_資格グループ

    資格GRP資格CD
    11
    12
    13
    24
    25
    26
    37
    38
    39
    410
    411
    412
    513
    514
    515

     
    ■SQL (>> 6に掲載されている「以下の表」の名前を仮に t_資格計算 とします )

    SELECT 作業員CD
         , Sum( total ) As 金額
    FROM
    (
        SELECT 作業員CD
             , Sum( 金額 ) As total
        FROM t_資格計算
        GROUP BY 作業員CD
        
        UNION ALL
        
        SELECT 作業員CD
             , Count(1) * 400
        FROM 
        (
            SELECT x.資格GRP
                 , x.作業員CD
            FROM
            (
                SELECT 資格GRP
                     , 資格CD
                     , 作業員CD
                FROM t_資格グループ, 
                     ( SELECT DISTINCT 作業員CD FROM t_資格計算 ) tmp
            ) x
            LEFT JOIN t_資格計算 y
                   ON x.作業員CD = y.作業員CD AND
                      x.資格CD = y.資格CD
            GROUP BY x.資格GRP
                   , x.作業員CD
            HAVING Count(1) = Count( y.作業員CD )
        ) q_plus
        GROUP BY 作業員CD
    ) q_union
    GROUP BY 作業員CD
    ORDER BY 作業員CD
    ;
    

     
    ■結果

    作業員CD金額
    19,600
    27,600
    32,800
    42,800

     

    メインサブフォームで表示できればうれしいです

    SQLの結果をクエリとして保存するのではなく
    SQL文を直接、フォームのレコードソースに指定するといいでしょう

    11
    hiroton 2025/01/21 (火) 18:28:44 8ec45@f966d >> 7

    何も考えずにレス付けるんですが400ってリテラルもデータベース化できないですかね?

    13
    mayu 2025/01/21 (火) 19:50:38 修正 fc5d2@6c788 >> 7

    400ってリテラルもデータベース化できないですかね?

    私が開発するなら、保守性や拡張性を考慮してテーブルへ落とし込みます
     

    資格GRP集約名義プラス手当金適用可否
    1手当A400TRUE
    2手当B400TRUE
    3手当C400TRUE
    4手当D400TRUE
    5手当E400TRUE

     
    ただ、マスタ化するかどうかは要件次第ではないでしょうか

    1. 手当金の種類は1つだが、金額が変更される可能性がある
    2. 資格GRP毎に手当金が個別に変更される可能性がある
    3. SQL文に埋め込まれたリテラル値を 他のDBAが根拠や由来を理解できない可能性がある

    いずれに該当するのか、これは上流工程で考慮するべき項目ですから
    今回のご質問では、この部分のリスクヘッジには言及しませんでした

    例えば、リスク1 だけを考慮する場合は
    DB化せず、SQL内のリテラルを変数にしてカバーするよう手段を講じるかもしれませんね

    + PARAMETERS prm手当金 CURRENCY;
    -          , Count(1) * 400
    +          , Count(1) * CCur(Nz(prm手当金, 400))