1

アクセス2007でクエリにアプローチする方法についてのアイデアが必要です。特定の日の作業に対するボーナスを計算するためです。

異なるソフトウェアからインポートされた2つのテーブルがあります。

1つのテーブルは毎日で、次のリストがあります。

  • 各従業員ID
  • パート/フルタイム/オンコールコードのステータス
  • 毎日の労働時間:

Date       | ID  | jobcode |  hours worked |   
8/01/2012  | 003 | Full    | 8             |  
8/01/2012  | 004 | Part    | 4             |  
8/02/2012  | 003 | Full    | 8             |  
8/02/2012  | 004 | part    | 5             |  

2番目のテーブルには

  • 休日の開始日
  • 休日の終了日
  • 各タイプの従業員がその日またはその範囲で働かなければならない合計時間

例:

begin      |   End      |  Parttime  | Fulltime |   
8/01/2012  | 8/01/2012  |      4     |    8     |  
9/01/2012  | 9/02/2012  |      4     |    12    |  
10/01/2012 | 10/01/2012 |      4     |    8     |  
11/01/2012 | 11/01/2012 |      4     |    8     |  

1年に約30の休日があり、従業員が必要な時間すべて働いた場合、1年後にボーナスを受け取ります。

従業員が要件を満たしていない休日と、どれだけ休暇を取っているのかを示すクエリを作成する必要があります。

私は、言語に慣れているvbaでそれを行うことを考えました。それはより良いルートですか?

日付の結合も機能すると思いましたが、複数の日付にまたがる休日を処理する方法がわかりません。

アイデアをありがとう。

4

3 に答える 3

0

標準のSQL(私はMS Accessを避けようとしています)では、次のようなことができます。

select x.* ,
       expected = case x.job_code
                    when 'Full' then y.Fulltime
                    when 'Part' then y.Parttime
                  end ,
       delta    = x.actual
                - case x.job_code
                    when 'Full' then y.Fulltime
                    when 'Part' then y.Partime
                  end
from ( select emp_id        = t.id      ,
              job_code      = t.jobcode ,
              holiday_start = h.begin   ,
              holiday_end   = h.end     ,
              actual        = sum( t.hours_worked )
       from employee_time t
       join holiday       h on t.date between h.being and h.end
       group by t.id    ,
                h.begin ,
                h.end
     ) x
join holiday y on y.begin = x.holiday_start
              and y.end   = x.holiday_end
where (   x.actual
        - case x.job_code
            when 'Full' then y.Fulltime
            when 'Part' then y.Parttime
          end
      ) < 0

最初に仮想テーブルを使用します(句のサブクエリはfrom別名です。この仮想テーブルは、データを要約するためxに使用して、特定の休日ごとに各従業員の実際の労働時間を計算します。group by

次に、それを休日テーブル(別名y)に戻し、予想される時間を取得します。

デルタは実際のように計算されます-あなたが期待するかもしれないように、期待されます。期待値は、を使用して数回計算する必要がありcase...whenます。

このwhere句は、非負のデルタを持つワーカーを除外します。

簡単!

于 2012-09-06T16:56:51.847 に答える
0

OK、これはテスト済みで、私にとってはうまくいきます。予約名を避けるために、いくつかのフィールド名を変更しました。また、2 番目のテーブルに休日名を追加しました。

SELECT Hours.EmpID, Hours.JobCode, Holidays.HolidayName, Sum(Hours.HoursWorked) AS TotalHours, Holidays.Fulltime AS Req, [TotalHours]-[fulltime] AS Balance
FROM Holidays, Hours
WHERE (((Hours.DateWorked) Between [begindate] And [enddate]) AND ((Hours.JobCode)='full'))
GROUP BY Hours.EmpID, Hours.JobCode, Holidays.HolidayName, Holidays.Fulltime

Union

SELECT Hours.EmpID, Hours.JobCode, Holidays.HolidayName, Sum(Hours.HoursWorked) AS TotalHours, Holidays.parttime AS Req, [TotalHours]-[parttime] AS Balance
FROM Holidays, Hours
WHERE (((Hours.DateWorked) Between [begindate] And [enddate]) AND ((Hours.JobCode)='part'))
GROUP BY Hours.EmpID, Hours.JobCode, Holidays.HolidayName, Holidays.parttime;

私が得る出力(9月にも時間を追加しました)は次のとおりです。

EmpID  JobCode  HolidayName   TotalHours  Req  Balance
3      Full     Happy August           8    8        0
3      Full     Labor Day             16   12        4
4      Part     Happy August           4    4        0
4      Part     Labor Day              9    4        5
于 2012-09-06T20:55:32.103 に答える
0

最初のテーブルとより一貫性のある形式で 2 番目のテーブルを取得すると、作業がずっと楽になります。彼らにその変更をさせることができれば、必要なのは参加することだけです。(ただし、予約語を避け、よりわかりやすい列名を使用することを検討する必要があります。

CREATE TABLE Table1
    ([Date] date, [ID] char(3), [jobcode] varchar(4), [hours_worked] int);

INSERT INTO Table1
    ([Date], [ID], [jobcode], [hours_worked])
VALUES
    ('2012-08-01', 003, 'Full', 8),
    ('2012-08-01', 004, 'Part', 4),
    ('2012-08-02', 003, 'Full', 8),
    ('2012-08-02', 004, 'part', 5);

-- I added this one, a full timer who didn't work enough hours on 09-01.
insert into table1 values ('2012-09-01', '003', 'Full', 11);

CREATE TABLE Table2
    ([begin] date, [End] date, [jobcode] char(4), [hours_to_work] int);

INSERT INTO Table2
    ([begin], [End], [jobcode], [hours_to_work])
VALUES
    ('2012-08-01', '2012-08-01', 'Part', 4),
    ('2012-08-01', '2012-08-01', 'Full', 8),
    ('2012-09-01', '2012-09-02', 'Part', 4),
    ('2012-09-01', '2012-09-02', 'Full', 12),
    ('2012-10-01', '2012-10-01', 'Part', 4),
    ('2012-10-01', '2012-10-01', 'Full', 8),
    ('2012-11-01', '2012-11-01', 'Part', 4),
    ('2012-11-01', '2012-11-01', 'Full', 8);

これで、結合を実行して正しい行を取得できます。

select t1.*, t2.*
from Table1 t1
inner join table2 t2 
  on t1.[date] between t2.[begin] and t2.[end]
  and t1.jobcode = t2.jobcode
  and t1.hours_worked < t2.hours_to_work;
于 2012-09-06T16:28:33.957 に答える