The following crosstab query seems to give the desired result:
TRANSFORM First(field_value) AS v
SELECT [name]
FROM
(
SELECT
[name],
'cat_' & LCase([cat]) & '_day' AS field_name,
[day] AS field_value
FROM ChoirOrder
UNION ALL
SELECT
[name],
'cat_' & LCase([cat]) & '_h_start' AS field_name,
[h_start] AS field_value
FROM ChoirOrder
UNION ALL
SELECT
[name],
'cat_' & LCase([cat]) & '_h_end' AS field_name,
[h_end] AS field_value
FROM ChoirOrder
UNION ALL
SELECT
[name],
'cat_' & LCase([cat]) & '_order' AS field_name,
[ord] AS field_value
FROM ChoirOrder
) AS u
GROUP BY [name]
PIVOT field_name IN
(
'cat_a_day', 'cat_a_h_start', 'cat_a_h_end', 'cat_a_order',
'cat_b_day', 'cat_b_h_start', 'cat_b_h_end', 'cat_b_order',
'cat_y_day', 'cat_y_h_start', 'cat_y_h_end', 'cat_y_order'
)
It returns:
name cat_a_day cat_a_h_start cat_a_h_end cat_a_order cat_b_day cat_b_h_start cat_b_h_end cat_b_order cat_y_day cat_y_h_start cat_y_h_end cat_y_order
---- ---------- ------------- ----------- ----------- ---------- ------------- ----------- ----------- ---------- ------------- ----------- -----------
C1 2014-03-04 09:00 10:00 1 2014-03-05 14:00 15:00 1
C2 2014-03-04 10:00 11:00 2 2014-03-05 15:00 16:00 2
C3 2014-03-04 11:00 12:00 3 2014-03-06 09:00 10:00 1
C4 2014-03-04 12:00 13:00 4 2014-03-06 12:00 13:00 4
C5 2014-03-05 16:00 17:00 3 2014-03-06 10:00 11:00 2
C6 2014-03-06 11:00 12:00 3