Помимо динамического SQL,
Если каждый бит выходных данных будет принадлежать только одному месяцу, то вы можете жестко закодировать все дни с 1 по 31:
with data as (
select *
from (
values
(001, '20111101', 319),
(002, '20111101', 355),
(003, '20111101', 352),
(001, '20111102', 340),
(002, '20111102', 322),
(003, '20111102', 351)
) foo (EmployeeID, [Date], [Minutes])
),
prepared_data as (
select EmployeeID, [Minutes], day([date]) as [day]
from data
)
select *
from
prepared_data
pivot (min([Minutes]) for [day] in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])) pvt
;
И затем позжеэтап скрывать или игнорировать другим способом столбцы, которые имеют только null
s.