CLEAR CREATE CURSOR theTable (OperationID I ,CDate D, CTime C(5), Patient C(30)) INSERT INTO theTable VALUES (345,DATE(2005,10,1),'10:10','Fabio') INSERT INTO theTable VALUES (367,DATE(2005,10,1),'10:10','Jaime') INSERT INTO theTable VALUES (399,DATE(2005,10,1),'10:13','Jaime') INSERT INTO theTable VALUES (444,DATE(2005,10,2),'10:10','Fabio') INDEX ON OperationID TAG PK CANDIDATE INDEX ON CDate TAG IK1 INDEX ON CTime+BINTOC(DOW(CDate),1) TAG IK2 && add this index SunDate = DATE(2005,10,1) SELECT ; CTime ; , MAX(IIF(DOW(CDate)=1,Patient,SPACE(30))) AS Sunday ; , MAX(IIF(DOW(CDate)=2,Patient,SPACE(30))) AS Monday ; , MAX(IIF(DOW(CDate)=3,Patient,SPACE(30))) AS Tuesday ; , MAX(IIF(DOW(CDate)=4,Patient,SPACE(30))) AS Wednesday; , MAX(IIF(DOW(CDate)=5,Patient,SPACE(30))) AS Thursday ; , MAX(IIF(DOW(CDate)=6,Patient,SPACE(30))) AS Friday ; , MAX(IIF(DOW(CDate)=7,Patient,SPACE(30))) AS Saturday ; FROM theTable T ; JOIN (SELECT T.OperationID ; , COUNT(TB.OperationID) rowInGroup; FROM theTable T ; JOIN theTable TB ; ON TB.CTime+BINTOC(DOW(TB.CDate),1) == T.CTime+BINTOC(DOW(T.CDate),1); AND TB.OperationID <= T.OperationID; WHERE T.CDate between m.SunDate AND m.SunDate+3; GROUP BY 1) GG ON T.OperationID = GG.OperationID; GROUP BY CTime,rowInGroup>2) In your sample code, if i have at say 9:00 Fabio on Monday and Jaime on Wednesday, they figure in the same row in the result, which is the desired behavior. In real application, this happens only 1% of the cases.