SELECT StaffNo, StaffName, nvl(max(DECODE(DD,'01',pattern,null)),'−') D01, nvl(max(DECODE(DD,'02',pattern,null)),'−') D02, nvl(max(DECODE(DD,'03',pattern,null)),'−') D03, nvl(max(DECODE(DD,'04',pattern,null)),'−') D04, nvl(max(DECODE(DD,'05',pattern,null)),'−') D05, -- (中略) nvl(max(DECODE(DD,'28',pattern,null)),'−') D28, nvl(max(DECODE(DD,'29',pattern,null)),'−') D29, nvl(max(DECODE(DD,'30',pattern,null)),'−') D30, nvl(max(DECODE(DD,'31',pattern,null)),'−') D31 from (select s.StaffNo, s.StaffName, to_char(r.Wrokday,'DD') dd, case when TO_CHAR(r.EndTime,'HH24:MI')<='13:30' then '△' when TO_CHAR(r.StartTime,'HH24:MI')>'12:00' then '▽' else '○' end pattern FROM Staff s, Shift sft, Reservation r WHERE s.StaffNo = sft.StaffNo AND sft.ReservationNo = r.ReservationNo AND TO_CHAR(r.Workaday,'YYYY/MM')='2004/02' ) v GROUP BY StaffNo, StaffName ORDER BY StaffNo;
なお、Reservation r は ReservationNo,Workaday で Unique と言う前提で作成してみました。 (休みの場合はレコードなし) なので max は該当日付のレコードがあれば△▽○のどれか 無ければ null となります。