Microsoft Access 掲示板

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

15 コメント
views
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))