连接具有多个值的两个表

时间:2014-02-09 14:53:23

标签: sql sql-server

我必须加入两个表, Emphours EmpStatus ,以便让每位员工每天的工作时间和工作状态。

我试图模拟这种情况。 我需要类似于表3的结果。

小时数也可以每周分组。

我需要的是每个员工每周的工作时间以及他当时的状态和职位。

注意:

  • 发薪日是每隔一个星期五;一周从周六到周五。

  • 表跟踪员工状态何时发生变化。

设置dateformat mdy; 声明@EmpHours表 (员工int,工作日日期,发薪日期,小时int,职位varchar(50)); 插入@EmpHours值 (101, '1/1/2014年', '1/3/2014年',8 '助理'), (101, '1/3/2014年', '1/3/2014年',8 '助理'), (101, '1/4/2014年', '1/17/2014年',8 '助理'), (101, '1/5/2014年', '1/17/2014年',8 '助理'), (101, '1/7/2014年', '1/17/2014年',8 '助理'), (101, '1/8/2014年', '1/17/2014年',8 '助理'), (101, '1/9/2014年', '1/17/2014年',8 '助理'), (101, '1/11/2014年', '1/17/2014年',8 '助理'), (101, '1/13/2014年', '1/17/2014年',8 '助理'), (101, '1/14/2014年', '1/17/2014年',8 '助理'), (101, '1/18/2014年', '2/14/2014年',8 '助理'), (102, '1/1/2014年', '1/3/2014年',7, '管理器'), (102, '1/25/2014年', '1/31/2014年',7, '管理器'), (102, '1 /二千〇一十四分之二十六', '1/31/2014年',7, '管理器'), (102, '1/28/2014年', '1/31/2014年',7, '管理器'), (102, '1/31/2014年', '1/31/2014年',7, '管理器'), (103, '1/1/2014年', '1/3/2014年',5 '实习生'), (103, '1/31/2014年', '1/31/2014年',6 '实习生'), (104, '1/14/2014年', '1/17/2014年',5 '监'), (104, '1 /二千零一十四分之三十', '1 /二千〇一十四分之三十一',6 '监');

- 从@EmpHours中选择* 声明@EmpStatus表 (employee int,start_date date,status varchar(20)); 插入@EmpStatus值 (101, '1/1/2014年', '兼职'), (101, '1/18/2014年', '全职'), (102, '1/1/2014年', '季节性'), (102, '1/18/2014年', '全职'), (103, '1/1/2014年', 'partime'), (103, '1/18/2014年', '全职'), (104, '1/4/2014年', '兼职'), (104, '1 /二千零十四分之十八', '全职');

表3

employee    status  hours   position    workday weekend payday  
101 parttime    8   assistant   1/1/2014    1/3/2014    1/3/2014    
101 parttime    8   assistant   1/3/2014    1/3/2014    1/3/2014    
101 parttime    8   assistant   1/4/2014    1/10/2014   1/17/2014   
101 parttime    8   assistant   1/5/2014    1/10/2014   1/17/2014   
101 parttime    8   assistant   1/7/2014    1/10/2014   1/17/2014   
101 parttime    8   assistant   1/8/2014    1/10/2014   1/17/2014   
101 parttime    8   assistant   1/9/2014    1/10/2014   1/17/2014   
101 parttime    8   assistant   1/11/2014   1/17/2014   1/17/2014   
101 parttime    8   assistant   1/13/2014   1/17/2014   1/17/2014   
101 parttime    8   assistant   1/14/2014   1/17/2014   1/17/2014   
101 fulltime    8   assistant   1/18/2014   1/24/2014   2/14/2014   
102 seasonal    7   manager 1/1/2014    1/3/2014    1/3/2014    
102 fulltime    7   manager 1/25/2014   1/25/2014   2/14/2014   
102 fulltime    7   manager 1/26/2014   1/26/2014   2/14/2014   
102 fulltime    7   manager 1/28/2014   1/28/2014   2/14/2014   
102 fulltime    7   manager 1/31/2014   1/31/2014   2/14/2014   
103 parttime    5   intern  1/1/2014    1/3/2014    1/3/2014    
103 fulltime    6   intern  1/31/2014   1/31/2014   2/14/2014   
104 parttime    5   supervisor  1/14/2014   1/17/2014   1/17/2014   
104 fulltime    6   supervisor  1/30/2014   1/31/2014   1/31/2014

1 个答案:

答案 0 :(得分:0)

SELECT    EH.Employee
    ,ES.[Status]
    ,SUM(EH.[Hours]) AS Total_Hours
    ,EH.Position
    ,EH.Workday
    ,DATEADD(dd, 7-(DATEPART(dw, EH.Workday)), EH.Workday) AS [WeekEnd]
    ,EH.PayDay

FROM    EmpHours EH INNER JOIN EmpStatus ES
ON      EH.Employee = ES.Employee
GROUP BY EH.Employee,ES.[Status],EH.Position,EH.Workday,EH.PayDay
         ,DATEADD(dd, 7-(DATEPART(dw, EH.Workday)), EH.Workday)