[英]How can I make multiple records to be printed as a single row
替代文字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表示员工手动设置的时间。 addOn表示系统时间,即插入记录的时间。
我必须承认,我还没有完全阅读所有内容,但我认为您可以自己解决其余的问题。 基本上,您可以将表时间表与其自身连接。
我做了这个...
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,但原则上它也应该为您工作。
让我知道您是否还有问题
您可能要签出PIVOT运算符。 它基本上允许您使用特定的行值在结果集中创建新的列。
您将必须提供用于合并多行的汇总函数-例如(假设您每天拆分数据),您必须决定如何在同一天处理多个“轮班开始”事件。 假设此类事件永远不会发生,您仍然必须使用汇总。 在这种情况下,MAX()通常是一个安全的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.