alt text http://img59.imageshack.us/img59/962/62737835.jpg
这三列取自3个表格。换句话说,这些记录是 通过加入3个表来检索。
这基本上是一个非常简单的时间表,可以跟踪班次开始时间,午餐时间等。
我希望这四条记录显示在一行中,例如:
setDate --- ShiftStarted --- LunchStarted --- LunchEnded ---- ShiftEnded ----- TimeEntered
注意:丢弃TimeEntered列。我稍后会处理这个问题,一旦我知道如何解决上述问题,我就很容易处理其余问题。
我该怎么做?
更多信息 - 这是我的疑问:
SELECT TimeSheet.setDate, TimeSheetType.tsTypeTitle
FROM TimeSheet
INNER JOIN TimeSheetDetail ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID
INNER JOIN TimeSheetType ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID
TimeSheet表包含以下列:
timeSheetID
employeeID - FK
setDate
setDate代表今天的日期。
TimeSheetType表由以下列组成:
timeSheetTypeID
tsTypeTitle
tsTypeTitle代表班次,例如班次开始,午餐开始,班次结束等等。
TimeSheetDetail表包含以下列:
timeSheetDetailID
timeSheetID - FK
timeSheetTypeID - FK
timeEntered
addedOn
timeEnetered表示员工手动设置的时间。 addedOn表示系统时间,即插入记录的时间。
答案 0 :(得分:2)
我必须承认我还没有完全阅读所有内容,但我认为你可以自己解决剩下的问题。基本上你可以自己加入表格时间表。
我这样做了......
create table timesheet (timesheet number, setdate timestamp, timesheettype varchar2(200), timeentered timestamp);
insert into timesheet values (1,to_date('2010-08-02','YYYY-MM-DD'),'Shift Started',current_timestamp);
insert into timesheet values (1,to_date('2010-08-02','YYYY-MM-DD'),'Lunch Started',current_timestamp);
insert into timesheet values (1,to_date('2010-08-02','YYYY-MM-DD'),'Lunch Ended',current_timestamp);
insert into timesheet values (1,to_date('2010-08-02','YYYY-MM-DD'),'Shift Ended',current_timestamp);
commit;
select * from timesheet t1
left join timesheet t2 on (t1.timesheet = t2.timesheet)
where t1.timesheettype = 'Shift Started'
and t2.timesheettype = 'Lunch Started'
......然后离开了这个
TIMESHEET SETDATE TIMESHEETTYPE TIMEENTERED TIMESHEET_1 SETDATE_1 TIMESHEETTYPE_1 TIMEENTERED_1
1 02.08.2010 00:00:00.000000 Shift Started 05.08.2010 12:35:56.264075 1 02.08.2010 00:00:00.000000 Lunch Started 05.08.2010 12:35:56.287357
它不是SQL Server,但原则上它也适用于你。
如果您还有问题,请告诉我
答案 1 :(得分:0)
您可能想查看PIVOT运算符。它基本上允许您使用特定的行值在结果集中创建新列。
你必须提供一个聚合函数来组合多行 - 例如(假设你每天分割数据),你必须决定如何处理多个“shift started”事件。同一天。假设这样的事件永远不会发生,你仍然需要使用聚合。在这种情况下,MAX()通常是安全的选择。