如何将多个记录打印为单行

时间:2010-08-05 09:00:21

标签: sql sql-server sql-server-2005 tsql

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表示系统时间,即插入记录的时间。

2 个答案:

答案 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()通常是安全的选择。