1

我需要有关如何在 access 2007 中处理查询的想法。它可以计算特定工作日的奖金。

我有两个从不同软件导入的表。

每天一张桌子并列出:

  • 每个员工 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             |  

第二张桌子有

  • 假期开始的一天
  • 假期结束日
  • 每种类型的员工在那些日子或几天范围内必须工作的总小时数

例子:

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     |  

一年大约有 30 个假期,如果员工按规定的时间工作,一年后可以获得奖金。

我需要创建一个查询,告诉我员工没有满足他们的要求的假期以及他们休假的时间。

我曾想过在我更熟悉该语言的 vba 中做这件事。那是更好的路线吗?

我认为日期的加入也可以,但不确定如何处理跨越多个日期的假期。

感谢您的任何想法。

4

3 回答 3

0

好的,这是经过测试的,对我有用。更改了一些字段名称以避免保留名称。还将假日名称添加到第二个表中。

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

在标准 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

如果您以与第一个表格更一致的格式获得第二个表格,您的生活会容易得多。如果你能让他们做出改变,你所需要的只是加入。(尽管您应该考虑避免保留字,并使用更具描述性的列名。

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 回答